我在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;
}
您将指针serverIP
指向堆栈内存url
。
当函数退出时,这将超出范围,因此您的指针指向垃圾。
您可以做的是将serverIP
设置为缓冲区,然后将URL复制到其中。然后它会持续下去。
那是:
static TCHAR serverIP[256] = _TEXT("");
然后:
_tcsnccpy(serverIP, url, 255);
或者按照@DavidOtano的建议,您可以保留现有的 serverIP 指针,并使用:
serverIP = _tcsdup(url);
但是,如果您这样做,您将动态分配内存,因此需要记住调用:
free(serverIP);
当您不再需要它时,以避免内存泄漏。
您将静态指针变量设置为指向函数返回后不再存在的局部变量。
从 Windows 程序中的函数返回字符串的一个好方法是返回一个 std::wstring
。
试试看。
关于 LPTSTR
和 _TEXT
,如果您打算在 Windows 9x 中的 DLL 中支持 MFC,则只需要这样做。是这样吗?如果没有,那就抛弃Microsoft愚蠢。
根据上述建议修复的代码(即兴发挥,编译器的手未触及):
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;
}
这段代码的一个很好的属性是它不再修改全局变量。