значение char * будет повреждено во время присваивания - PullRequest
0 голосов
/ 27 октября 2010

У меня есть следующий код, который получает возвращаемое значение из функции как 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 ]

5 голосов
/ 27 октября 2010

Я полагаю, что вы возвращаете символ *, указывающий на массив, выделенный в стеке, то есть эту строку:

TCHAR tSZValue[MAX_PATH] = {0};

, за которой следует:

char* cpRegKeyVal=tSZValue;

Этоопасно, и вы испытываете из первых рук конечный результат!

РЕДАКТИРОВАТЬ: почему бы вам напрямую не назначить строку CSt в функции и не вернуть ее?

5 голосов
/ 27 октября 2010

Функция возвращает указатель на tSZValue, которая является локальной переменной, поэтому перестает существовать, когда выходит из области видимости.

0 голосов
/ 27 октября 2010

Похоже, что ReadFromRegistry не выделяет память для возврата значения (или делает, но находится в стеке и уничтожается до возврата из функции).

Вместо возврата символа *, возможно, выможет передать ссылку на char * в качестве параметра и выделить вашу память вне ReadFromRegistry.

0 голосов
/ 27 октября 2010

Вы возвращаете указатель на tSZValue, который является временной переменной и будет перезаписан через некоторое время после выхода из функции.

Самое простое решение: ReadFromRegistry() вернуть CString вместо char *.

...