在我正在处理的 C++ Windows(XP 和 NT,如果有区别)应用程序中,我需要获取与正在执行代码的计算机关联的网络名称,以便我可以从 C:\ 转换本地文件名文件名.ext 到 \\network_name\C$\filename.ext。我该怎么做?
或者,如果有一个函数可以进行我描述的转换,那就更好了。我查看了 WNetGetUniversalName,但这似乎不适用于本地(C 驱动器)文件。
在我正在处理的 C++ Windows(XP 和 NT,如果有区别)应用程序中,我需要获取与正在执行代码的计算机关联的网络名称,以便我可以从 C:\ 转换本地文件名文件名.ext 到 \\network_name\C$\filename.ext。我该怎么做?
或者,如果有一个函数可以进行我描述的转换,那就更好了。我查看了 WNetGetUniversalName,但这似乎不适用于本地(C 驱动器)文件。
有不止一种选择:
一种。按照 Stu 的建议使用 Win32 的 GetComputerName()。
示例:http
://www.techbytes.ca/techbyte97.html
或
b。使用 Winsock 下的函数 gethostname()。此功能是跨平台的,如果您的应用程序要在 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
你会想要 Win32 的 GetComputerName:
http://msdn.microsoft.com/en-us/library/ms724295(VS.85).aspx
我同意 Pascal 关于使用 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
);