Environment variables ExpandEnvironmentStringsA()字符串下标超出范围

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

我有一个函数,可以检查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;
}
当我附加到可执行文件并调试它时,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。它没有价值,也没有超出它的范围