我正在用C / C ++学习win32编程。在学习的过程中,我的老师希望我编写一个简单的程序,它可以显示它在其上运行的计算机的名称,然后,如果目标计算机的名称是“USER”,则在输出控制台中显示警告。我写了下面的代码,但它不起作用。
myFunction代码:
tchar * getComputerName() {
bufCharCount = INFO_BUFFER_SIZE;
if (!GetComputerName(infoBuf, &bufCharCount))
printError(TEXT("GetComputerName"));
return (TCHAR*)infoBuf;
}
调用代码:
if (getComputerName() == (TCHAR*)"USER") {
printf("Target OS Detected \n");
}
我该如何解决这个问题?
答案 0 :(得分:2)
发布的代码有几个问题。最明显的一个是使用TCHAR
s。在Win9x支持Unicode之前发明了TCHAR
,试图保持Win9x和Windows NT之间的代码源代码兼容(后者在整个过程中使用Unicode和UTF-16LE)。今天,根本没有理由使用TCHAR
。只需使用wchar_t
和带有W
后缀的Windows API调用。
C风格的演员表(例如return (TCHAR*)infoBuf
)是等待发生的另一个错误。如果在这种情况下代码在没有强制转换的情况下进行编译,则表示您使用的是不兼容的类型(char
与wchar_t
)。
另外,还有一个逻辑错误:当使用C风格的字符串(通过指向零终止字符序列的指针表示)时,不能使用operator==
来比较字符串内容。它会比较指针。对此的解决方案是调用显式字符串比较(strcmp),或使用C ++ string代替。后者重载operator==
以执行区分大小写的字符串比较。
固定版本可能如下所示:
#include <windows.h>
#include <string>
#include <iostream>
#include <stdexcept>
std::wstring getComputerName() {
wchar_t buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0};
DWORD cchBufferSize = sizeof(buffer) / sizeof(buffer[0]);
if (!GetComputerNameW(buffer, &cchBufferSize))
throw std::runtime_error("GetComputerName() failed.");
return std::wstring(&buffer[0]);
}
int main() {
const std::wstring compName = getComputerName();
if ( compName == L"USER" ) {
std::wcout << L"Print your message" << std::endl;
}
}
答案 1 :(得分:1)
以下代码适用于我:
#include <windows.h>
// ...
std::string get_computer_name()
{
const int buffer_size = MAX_COMPUTERNAME_LENGTH + 1;
char buffer[buffer_size];
DWORD lpnSize = buffer_size;
if (GetComputerNameA(buffer, &lpnSize) == FALSE)
throw std::runtime_error("Something went wrong.");
return std::string{ buffer };
}
答案 2 :(得分:-2)
您无法比较两个字符串指针来比较字符串。
DWORD dw_computer_name = MAX_COMPUTERNAME_LENGTH;
TCHAR computer_name[MAX_COMPUTERNAME_LENGTH+1];
if ( 0 != GetComputerName( computer_name, &dw_computer_name ) )
{
printError( TEXT( "GetComputerName" ) );
if ( 0 == _tcscmp( computer_name, _T("HOST") )
{
printf( "Target OS Detected \n" );
}
}