SuPriTo, благодарю.
Первое не абсолютно "в точку", но помогло навести на мысль чего бы такогого забить в поиск MSDN-а чтобы получить ответ.
На С++ определение точки монтирования для сетевого диска и получение IP, если при монтировании использовалось NetBios имя компьютера выглядит так:
[more]Имя сетевого диска (в формате напр. Z:\)передаётся как параметр запускаемой программы.
Код: #pragma warning( disable : 4996 )
#include <windows.h>
//#include <Winnetwk.h>//требует Mpr.lib //все три последующих заголовка включены в windows.h (по крайней мере в MSVS2005)
//#include <winsock2.h>//требует Ws2_32.lib
//#include <ws2tcpip.h>//требует Ws2_32.lib
#include <stdio.h>
#include <conio.h>
char* ProcessWNGUErrors(int err)
{
switch(err)
{
case NO_ERROR:
return "No Error";
case ERROR_BAD_DEVICE:
return "ERROR_BAD_DEVICE";
case ERROR_CONNECTION_UNAVAIL:
return "ERROR_CONNECTION_UNAVAIL";
case ERROR_EXTENDED_ERROR:
return "ERROR_EXTENDED_ERROR, do WNetGetLastError to get details!";
case ERROR_MORE_DATA:
return "ERROR_MORE_DATA";
case ERROR_NOT_SUPPORTED:
return "ERROR_NOT_SUPPORTED";
case ERROR_NO_NET_OR_BAD_PATH:
return "ERROR_NO_NET_OR_BAD_PATH";
case ERROR_NO_NETWORK:
return "ERROR_NO_NETWORK";
case ERROR_NOT_CONNECTED:
return "ERROR_NOT_CONNECTED";
}
return "uncnown error";
}
int main(int argc, char *argv[ ], char *envp[ ])
{
int err;
char Buffer[1000];
DWORD BufferSz = 1000;
UNIVERSAL_NAME_INFO *puni = (UNIVERSAL_NAME_INFO*) &Buffer;
REMOTE_NAME_INFO *prni = (REMOTE_NAME_INFO*) &Buffer;
if(argc < 2)
{
printf("No argument!");
return 1;
}
char *dest = argv[1];
if(dest[1] != ':')
{
printf("Local paths only!");
return 1;
}
printf("Passed path: %s\n", dest);
//WNetGetUniversalName Раскрывает данные смонтированного сетевого диска
//UNIVERSAL_NAME_INFO_LEVEL даёт просто строку, переданную в мастере подключения диска
//REMOTE_NAME_INFO_LEVEL выдаёт расширенную информацию о созданном подключении
err = WNetGetUniversalName(dest, UNIVERSAL_NAME_INFO_LEVEL, (LPVOID) &Buffer, &BufferSz);
printf("WNetGetUniversalName for UNIVERSAL_NAME_INFO_LEVEL processed with error %i (%s)\n", err, ProcessWNGUErrors(err));
if(err == NO_ERROR)
printf("returned params:\nUniversalName: %s\n", puni->lpUniversalName);
printf("============================================\n");
err = WNetGetUniversalName(dest, REMOTE_NAME_INFO_LEVEL, &Buffer, &BufferSz);
printf("WNetGetUniversalName for REMOTE_NAME_INFO_LEVEL processed with error %i (%s)\n", err, ProcessWNGUErrors(err));
if(err == NO_ERROR)
printf("returned params:\nConnectionName: %s\nRemainingPath: %s\nUniversalName: %s\n",
prni->lpConnectionName, prni->lpRemainingPath, prni->lpUniversalName);
printf("press any key to retrive host info...\n");
getch();
printf("============================================\n");
char HostName[260] = {0};
{ //тут находим конец имени хоста в полном пути
int ln=2;
while(ln<260)
{
if(prni->lpUniversalName[ln] == '\\')
break;
ln++;
}
ln -= 2;
memcpy(HostName, prni->lpUniversalName+2, ln); //и вырезаем его
}
if(!isalpha(HostName[0]))
{
printf("NO host name, IP is: %s\n", HostName);
return 0;
}
printf("host name is: %s\n", HostName);
//далее выковыриваем IP адрес из имени хоста
// Declare and initialize variables
DWORD dwError;
WSADATA wsaData;
int iResult;
struct hostent *remoteHost;
struct in_addr addr;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0)
{
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
printf("Calling gethostbyname with %s\n", HostName);
remoteHost = gethostbyname(HostName);
if (remoteHost == NULL)
{
dwError = WSAGetLastError();
if (dwError != 0)
{
if (dwError == WSAHOST_NOT_FOUND)
{
printf("Host not found\n");
return 1;
}
else if (dwError == WSANO_DATA)
{
printf("No data record found\n");
return 1;
}
else
{
printf("Function failed with error: %ld\n", dwError);
return 1;
}
}
}
else
{
printf("Function returned:\n");
printf("\tOfficial name: %s\n", remoteHost->h_name);
printf("\tAlternate names: %s\n", remoteHost->h_aliases);
printf("\tAddress type: ");
switch (remoteHost->h_addrtype)
{
case AF_INET:
printf("AF_INET\n");
break;
/*case AF_INET6:
printf("AF_INET\n");
break;*/
case AF_NETBIOS:
printf("AF_NETBIOS\n");
break;
default:
printf(" %d\n", remoteHost->h_addrtype);
break;
}
printf("\tAddress length: %d\n", remoteHost->h_length);
addr.s_addr = *(u_long *) remoteHost->h_addr_list[0];
printf("\tFirst IP Address: %s\n", inet_ntoa(addr));
}
return 0;
}