检索计算机的名称并将其保存在变量中

时间:2015-10-22 13:50:41

标签: c++ winapi

我正在用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");
        }

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

发布的代码有几个问题。最明显的一个是使用TCHAR s。在Win9x支持Unicode之前发明了TCHAR,试图保持Win9x和Windows NT之间的代码源代码兼容(后者在整个过程中使用Unicode和UTF-16LE)。今天,根本没有理由使用TCHAR。只需使用wchar_t和带有W后缀的Windows API调用。

C风格的演员表(例如return (TCHAR*)infoBuf)是等待发生的另一个错误。如果在这种情况下代码在没有强制转换的情况下进行编译,则表示您使用的是不兼容的类型(charwchar_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" );
    }
}