我正在尝试在我的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;
}
这里有什么问题?我总是得到一个空洞的反应):
答案 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。