Как в С++/Windows получить сетевое имя компьютера, на котором я работаю?

В приложении C++ для Windows (XP и NT, если это имеет значение), над которым я работаю, мне нужно получить сетевое имя, связанное с компьютером, на котором выполняется код, чтобы я мог преобразовать локальные имена файлов из C:\ filename.ext в \\network_name\C$\filename.ext. Как бы я это сделал?

В качестве альтернативы, если есть функция, которая просто выполняет описанное мной преобразование, это было бы еще лучше. Я просмотрел WNetGetUniversalName, но, похоже, это не работает с локальными файлами (диск C).


person Isaac Moses    schedule 14.08.2008    source источник


Ответы (4)


Вам понадобится Win32 GetComputerName:

http://msdn.microsoft.com/en-us/library/ms724295(VS.85).aspx

person Stu    schedule 14.08.2008

Существует более одной альтернативы:

а. Используйте Win32 GetComputerName(), как предложил Стью.
Пример: http://www.techbytes.ca/techbyte97.html
ИЛИ
б. Используйте функцию gethostname() под Winsock. Эта функция является кроссплатформенной и может помочь, если ваше приложение будет работать на других платформах, помимо Windows.
Ссылка MSDN: http://msdn.microsoft.com/en-us/library/ms738527(VS.85).aspx
ИЛИ
c. Используйте функцию getaddrinfo().
Ссылка MSDN: http://msdn.microsoft.com/en-us/library/ms738520(VS.85).aspx

person Pascal    schedule 14.08.2008
comment
К сожалению, ссылка на a) (techbytes.ca) больше недоступна. - person lowglider; 13.03.2013

Я согласен с Паскалем в использовании функции winsock gethostname(). Ну вот:

#include <winsock2.h> //of course this is the way to go on windows only

#pragma comment(lib, "Ws2_32.lib")

void GetHostName(std::string& host_name)
{
    WSAData wsa_data;
    int ret_code;

    char buf[MAX_PATH];

    WSAStartup(MAKEWORD(1, 1), &wsa_data);
    ret_code = gethostname(buf, MAX_PATH);

    if (ret_code == SOCKET_ERROR)
        host_name = "unknown";
    else
        host_name = buf;


    WSACleanup();

}
person jilles de wit    schedule 16.09.2008

Если вам нужно только имя локального компьютера (NetBIOS), используйте функцию GetComputerName. Он извлекает только имя локального компьютера, которое установлено при запуске системы, когда система считывает его из реестра.

BOOL WINAPI GetComputerName(
  _Out_   LPTSTR  lpBuffer,
 _Inout_ LPDWORD lpnSize
);

Подробнее о GetComputerName

Если вы хотите получить имя узла DNS, имя домена DNS или полное имя DNS, вызовите функцию GetComputerNameEx.

BOOL WINAPI GetComputerNameEx(
  _In_    COMPUTER_NAME_FORMAT NameType,
  _Out_   LPTSTR               lpBuffer,
  _Inout_ LPDWORD              lpnSize
);

Подробнее о GetComputerNameEx

person Ajay Gupta    schedule 08.10.2015