我有一个函数可以检查是否安装了IIS,并获取安装路径。
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;
}当我附加到我的可执行文件并对其进行调试时,retBuffer中的ExpandEnvironmentStringsA会返回一个值,显示安装路径。返回值显示28,就像放入缓冲区的TCHARS一样。一旦我进入下一行,将字符串路径名设置为retBuffer,它就会失败,给出一个超出范围的字符串下标。我明白这个错误意味着什么,我已经做过很多次了。让我感到奇怪的是,如果我在函数中指定了一个新的字符串var:
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++程序员,我在这方面学到了很多,也从你们那里学到了很多。希望有人对此有一个想法,因为我不希望花费更多的时间研究无用。谢谢。
发布于 2021-06-02 03:45:21
在深入研究之后,我发现路径名被设置得恰如其分。它在下一次调用另一个函数时会立即崩溃,因此我的调试是不正确的。现在我已经进一步扩展了作用域,希望我能解决这个问题。我自己也注意到,当我设置fakestring而不是pathname时,它不会崩溃的原因是因为我在崩溃的函数调用中传递了pathname。没有价值的情况下,它不会设置超出其范围的内容。
https://stackoverflow.com/questions/67794871
复制相似问题