GetComputerName()返回空Result

时间:2011-10-19 21:07:59

标签: c++ windows winapi

我正在尝试在我的C ++应用程序中使用GetComputerName()函数,但无法使其工作。这是我的代码:

.h:

#pragma once

class sample
{
public:
    sample();
    char* get_info_pcName();
    ~sample();
private:
    char* info_pcName;
};

.cpp:

#include "sample.h"

#include <windows.h>

sample::sample()
{
    this->info_pcName = 0;
}

char* sample::get_info_pcName()
{
    if (info_pcName)
        return this->info_pcName;

    this->info_pcName = new char[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD nComputerName = sizeof(this->info_pcName);
    if (!GetComputerName(this->info_pcName, &nComputerName))
    this->info_pcName = "error";

    return this->info_pcName;
}

这里有什么问题?我总是得到一个空洞的反应):

2 个答案:

答案 0 :(得分:2)

sizeof(this->info_pcName)产生char*的大小(系统上可能是4或8),而不是数组的长度。以下应该有效:

char* sample::get_info_pcName()
{
    if (info_pcName)
        return info_pcName;

    DWORD nComputerName = MAX_COMPUTERNAME_LENGTH + 1;
    info_pcName = new char[nComputerName];
    if (!GetComputerName(info_pcName, &nComputerName))
        info_pcName = "error";

    return info_pcName;
}

此外,以这种方式使用原始指针是不好的做法。我建议以下代替C ++ 03(对于C ++ 11,有更好的方法):

#include <cstring>
#include <vector>
#include <windows.h>

class sample
{
public:
    char const* get_info_pcName();

private:
    std::vector<char> info_pcName;
};

char const* sample::get_info_pcName()
{
    if (!info_pcName.empty())
        return &info_pcName[0];

    DWORD nComputerName = MAX_COMPUTERNAME_LENGTH + 1;
    info_pcName.resize(nComputerName);
    if (!GetComputerName(&info_pcName[0], &nComputerName))
        std::strcpy(&info_pcName[0], "error");

    return &info_pcName[0];
}

这样你就不需要手写的构造函数或析构函数,也不需要手写的拷贝构造函数或拷贝赋值运算符(你的类错误地缺少这两种操作符,这会导致内存在任何正常使用情况下被破坏)。

答案 1 :(得分:0)

它不漂亮,但它每次都有效。 VC6 ++ sp6。如果需要,将X更改为255。 t是CString值。

x = 100;
tmpBuf = (char *)malloc(x);
if(GetComputerName(tmpBuf,&x)){
    t.Format("%s",tmpBuf);
}
free(tmpBuf);

将CString t用于您需要的任何内容。我将它发送给SQL。