如何在 VS 2017 C++ Win32 应用程序中打印出 gethostname 结果?
How do I print out gethostname result in VS 2017 C++ Win32 application?
我正在尝试创建一个 Win32 桌面应用程序,它只打印出 运行 所在计算机的主机名。我设法使用 WSADATA 结构和 gethostname() 创建了这样一个运行良好的 C++ 控制台应用程序。但是,当我尝试在我的 Win32 桌面应用程序中实现它们时,它根本不起作用。
查看错误消息,它们指出 TCHAR - char incompatibilty/conversion 问题...关于如何使此应用程序正常工作的任何建议?
win32project.cpp:
#include "stdafx.h"
...
case WM_PAINT:
{
PAINTSTRUCT ps;
TCHAR szPath[128] = _T("");
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
gethostname(szPath, sizeof(szPath));
WSACleanup();
HDC hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10, szPath, _tcslen(szPath));
EndPaint(hWnd, &ps);
}
break;
...
上面win32project.cpp中包含的stdafx.h内容:
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN
// Windows Header Files:
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
// additional headers
#include <iostream>
#include <string>
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
如果你 read the documentation(或者只看函数声明),你会看到 gethostname()
不接受 TCHAR
输出缓冲区,只接受 char
缓冲。如果您在启用 Unicode 的情况下编译项目,TCHAR
将映射到 wchar_t
。这就是您的代码无法编译的原因。所以把TCHAR
改成char
,直接用TextOutA()
:
char szName[256] = "";
gethostname(szName, 256);
TextOutA(hdc, 10, 10, szName, strlen(szName));
否则,请考虑使用 GetComputerName()
代替:
TCHAR szName[MAX_COMPUTERNAME_LENGTH + 1] = TEXT("");
DWORD dwLen = sizeof(szName) / sizeof(TCHAR);
if (!GetComputerName(szName, &dwLen)) dwLen = 0;
TextOut(hdc, 10, 10, szName, dwLen);
或者更好的是,直接删除TCHAR
(你真的需要支持Win9x/ME吗?)直接使用wchar_t
:
WCHAR szName[MAX_COMPUTERNAME_LENGTH + 1] = L"";
DWORD dwLen = sizeof(szName) / sizeof(WCHAR);
if (!GetComputerNameW(szName, &dwLen)) dwLen = 0;
TextOutW(hdc, 10, 10, szName, dwLen);
我正在尝试创建一个 Win32 桌面应用程序,它只打印出 运行 所在计算机的主机名。我设法使用 WSADATA 结构和 gethostname() 创建了这样一个运行良好的 C++ 控制台应用程序。但是,当我尝试在我的 Win32 桌面应用程序中实现它们时,它根本不起作用。
查看错误消息,它们指出 TCHAR - char incompatibilty/conversion 问题...关于如何使此应用程序正常工作的任何建议?
win32project.cpp:
#include "stdafx.h"
...
case WM_PAINT:
{
PAINTSTRUCT ps;
TCHAR szPath[128] = _T("");
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
gethostname(szPath, sizeof(szPath));
WSACleanup();
HDC hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10, szPath, _tcslen(szPath));
EndPaint(hWnd, &ps);
}
break;
...
上面win32project.cpp中包含的stdafx.h内容:
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN
// Windows Header Files:
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
// additional headers
#include <iostream>
#include <string>
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
如果你 read the documentation(或者只看函数声明),你会看到 gethostname()
不接受 TCHAR
输出缓冲区,只接受 char
缓冲。如果您在启用 Unicode 的情况下编译项目,TCHAR
将映射到 wchar_t
。这就是您的代码无法编译的原因。所以把TCHAR
改成char
,直接用TextOutA()
:
char szName[256] = "";
gethostname(szName, 256);
TextOutA(hdc, 10, 10, szName, strlen(szName));
否则,请考虑使用 GetComputerName()
代替:
TCHAR szName[MAX_COMPUTERNAME_LENGTH + 1] = TEXT("");
DWORD dwLen = sizeof(szName) / sizeof(TCHAR);
if (!GetComputerName(szName, &dwLen)) dwLen = 0;
TextOut(hdc, 10, 10, szName, dwLen);
或者更好的是,直接删除TCHAR
(你真的需要支持Win9x/ME吗?)直接使用wchar_t
:
WCHAR szName[MAX_COMPUTERNAME_LENGTH + 1] = L"";
DWORD dwLen = sizeof(szName) / sizeof(WCHAR);
if (!GetComputerNameW(szName, &dwLen)) dwLen = 0;
TextOutW(hdc, 10, 10, szName, dwLen);