GetComputerName () возвращает пустой результат - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь использовать функцию GetComputerName () в моем приложении C ++, но не могу заставить его работать.Вот мой код:

.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 ]

2 голосов
/ 20 октября 2011

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];
}

Таким образом, вам не нужен рукописный конструктор или деструктор, а также рукописный конструктор копирования или оператор копирования (оба из которых в вашем классе неправильно отсутствуют, что может привести к повреждению памяти при любом обычном использовании).

0 голосов
/ 16 января 2013

это не красиво, но работает каждый раз.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...