1

我在 Visual Studio 2013 上编写 C++ dll。我的 dll 应该从 ini 文件中读取参数。因此,我为此目的创建了一个函数(ReadConnectionSettings())。我的静态变量 serverIP 在函数工作期间正确获取值,但是一旦函数完成运行变量 (serverIP) 就会失去它的值。似乎是什么问题?

static LPTSTR   serverIP = _TEXT("");

void ReadConnectionSettings()
{
    TCHAR url[256];

    GetPrivateProfileString(_T("Connection"), _T("Url"), _T(""), url, 256, NameOfIniFile);

    serverIP = url;

}
4

2 回答 2

5

您将指针指向serverIP堆栈内存url

当函数退出时,这超出了范围,因此您的指针指向垃圾。

您可以做的是创建serverIP一个缓冲区,然后将 URL复制到其中。然后它会持续存在。

那是:

 static TCHAR serverIP[256] = _TEXT("");

然后:

 _tcsnccpy(serverIP, url, 255);

或者正如@DavidOtano 建议的那样,您可以保留现有的 serverIP 指针,并使用:

 serverIP = _tcsdup(url);

但是如果你这样做,你会动态分配内存,所以需要记住调用:

 free(serverIP);

当您不再需要它时,避免内存泄漏。

于 2014-03-04T06:02:59.837 回答
3

您将静态指针变量设置为指向函数返回后不再存在的局部变量。

从 Windows 程序中的函数返回字符串的一个好方法是返回一个std::wstring.

试试看。


关于LPTSTRand _TEXT,只有当您打算在 Windows 9x 的 DLL 中支持 MFC 时才需要它。是这样吗?如果没有,那就放弃微软的愚蠢。


根据上述建议修复的代码(即兴发挥,编译器未触及):

auto connection_settings()
    -> std::wstring
{
    std::wstring url( 256, L'#' );

    auto const n = GetPrivateProfileString( L"Connection", L"Url", L"", &url[0], url.size(), NameOfIniFile );
    url.resize( n );
    return url;
}

这段代码的一个很好的特性是它不再修改全局变量

于 2014-03-04T06:03:25.570 回答