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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
9 526
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

Есть несколько альтернатив:

а. Используйте 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

К сожалению, ссылка на a) (tech bytes.cat) больше не доступна.

lowglider 13.03.2013 14:34

Я согласен с Паскалем на использование функции 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();

}

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

Другие вопросы по теме