0

我有以下代码,它从函数获取返回值char*

cDestDrive = ReadFromRegistry(HKEY_CURRENT_USER,NDSPATH,szDestPathRoot);

我能够读取里面的值,cDestDrive 直到我分配它。我分配它的那一刻:

 CString strServerAddress = cDestDrive;

cDestDrive 的值被更改(损坏),我无法在CString strServerAddres任何想法中获得值,为什么会发生这种情况。

编辑: 从注册表读取的代码

char* CNDSShellExtender::ReadFromRegistry(HKEY hKey,LPCTSTR lpNDS,LPSTR lpRegKey)
{

        HKEY hRegKey=NULL;
        if(hKey==NULL || lpNDS==""||lpNDS==NULL||lpRegKey==""||lpRegKey==NULL)
            MessageBox(NULL,"Reading from Registry Failed!Invalid Path",
                                            _T("Network Drive Solution"),
                                                           MB_ICONERROR);

        LONG lOpenRes=RegOpenKey(hKey,lpNDS,&hRegKey);

        if (lOpenRes!=ERROR_SUCCESS ||lpNDS==NULL) 
            MessageBox ( NULL, "Can not Find Any Server to Connect",
                                            _T("NDSShellExtension"),
                                                     MB_ICONERROR );


        if(lOpenRes==ERROR_SUCCESS && lpNDS!=NULL)
        {
            TCHAR tSZValue[MAX_PATH] = {0};
            DWORD dwBufSize=MAX_PATH;
            LONG lCloseOut;
            LPBYTE lpStorage = reinterpret_cast<LPBYTE>(tSZValue);
            char* cpRegKeyVal=tSZValue;

            if (ERROR_SUCCESS == RegQueryValueEx(hRegKey,lpRegKey , 0, 0, (BYTE*)tSZValue, &dwBufSize))
                {
                    lCloseOut= RegCloseKey(hRegKey);
                    if (lCloseOut != ERROR_SUCCESS) 
                        MessageBox (NULL, "Registry Not Closed", 
                                        _T("NDSShellExtension"),
                                                 MB_ICONERROR );
                    return cpRegKeyVal;
                }
            else
            {
                    lCloseOut= RegCloseKey(hRegKey);
                    if (lCloseOut != ERROR_SUCCESS) 
                    MessageBox (NULL, "Registry Not Closed",
                                    _T("NDSShellExtension"),
                                             MB_ICONERROR );
                    return "";
            }
        }
            return "";
}
4

4 回答 4

5

该函数返回一个指向 tSZValue 的指针,它是一个局部变量,因此当它超出范围时不再存在。

于 2010-10-27T14:34:44.257 回答
5

我相信你正在返回一个 char* 指向一个分配在堆栈上的数组,即这一行:

TCHAR tSZValue[MAX_PATH] = {0};

其次是:

char* cpRegKeyVal=tSZValue;

这很危险,您正在亲身体验最终结果!

编辑:为什么不直接分配给函数中的 CString 并返回呢?

于 2010-10-27T14:35:09.263 回答
0

您正在返回一个指向 的指针tSZValue,这是一个临时变量,将在函数退出后的某个时间被覆盖。

最简单的解决方案:ReadFromRegistry()返回 aCString而不是 a char *

于 2010-10-27T14:35:20.683 回答
0

看起来 ReadFromRegistry 没有分配内存来返回值(或者它确实,但它在堆栈上并且在函数返回之前被销毁)。

除了返回 char *,也许您可​​以传入对 char * 的引用作为参数,并在 ReadFromRegistry 之外分配内存。

于 2010-10-27T14:35:48.127 回答