Как получить сетевое имя компьютера, на котором я работаю, в C ++ / Windows? - PullRequest
7 голосов
/ 14 августа 2008

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

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

Ответы [ 4 ]

9 голосов
/ 14 августа 2008

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

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

7 голосов
/ 14 августа 2008

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

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

1 голос
/ 08 октября 2015

Если вы хотите использовать только имя локального компьютера (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

1 голос
/ 16 сентября 2008

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

#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();

}
...