Environment variables ExpandEnvironmentStringsA()字符串下标超出范围
我有一个函数,可以检查IIS是否已安装,并获取安装路径Environment variables ExpandEnvironmentStringsA()字符串下标超出范围,environment-variables,Environment Variables,我有一个函数,可以检查IIS是否已安装,并获取安装路径 int IsIISInstalled(string &pathname) { DWORD returnvalue; long keyres = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\InetStp\\", 0, KEY_READ, &miva); if (keyres == ERROR_SUCCESS
int IsIISInstalled(string &pathname)
{
DWORD returnvalue;
long keyres = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\InetStp\\", 0, KEY_READ, &miva);
if (keyres == ERROR_SUCCESS)
{
char szBuffer[512];
DWORD dwBufferSize = sizeof(szBuffer);
ULONG nError;
nError = RegQueryValueExA(miva, "InstallPath", NULL, NULL, (LPBYTE)szBuffer, &dwBufferSize);
if (nError == ERROR_SUCCESS)
{
char retBuffer[512];
DWORD nsize = sizeof(retBuffer);
returnvalue = ExpandEnvironmentStringsA(szBuffer, retBuffer, nsize);
pathname = retBuffer;
}
}
if (!pathname.empty())
return 1;
else
return 0;
}
当我附加到可执行文件并调试它时,ExpandEnvironmentStringsA会返回一个值
在retBuffer中显示安装路径。returnvalue与放入缓冲区的TCHAR一样显示28。一旦我进入下一行,将字符串路径名设置为retBuffer,它就无法为我提供超出范围的字符串下标。我理解这个错误的含义,我已经做过很多次了。奇怪的是,如果我在函数中指定一个新的字符串变量:
string fakeresult;
并将fakeresult设置为retBuffer:
fakeresult = retBuffer;
正如我在上面的代码中一样,它通过的很好,没有错误。我用这段代码调用函数
string iis_path, miva_path;
int disable;
char *full_path;
//getMivaLocation(miva_path);
bool good2go;
int iisinstalled, empressaReturn, miaReturn;
iisinstalled = IsIISInstalled(iis_path);
这是否与我通过引用传递函数的路径名有关?
如果是这样,为什么?
如何修复此问题以返回数据?
我不是一个受过良好教育的C++程序员,我学习很多这一点,因为我去了,并从你们那里学到了很多。希望有人对此有个想法,因为我不想花太多时间去研究,结果一无所获。谢谢。进入下一步后,我发现路径名被设置为它应该设置的。它会在下次调用其他函数时立即崩溃,因此我的调试不正确。现在我已经进一步研究了,希望我能解决这个问题。同样出于我自己的考虑,当我设置fakestring而不是pathname时,它不会崩溃的原因是因为我在崩溃的函数调用中传递了pathname。它没有价值,也没有超出它的范围