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。これは一時変数であり、関数の終了後に上書きされます。

最も簡単な解決策: a の代わりに aをReadFromRegistry()返します。CStringchar *

于 2010-10-27T14:35:20.683 に答える
0

ReadFromRegistry は値を返すためにメモリを割り当てていないようです (または割り当てていますが、スタック上にあり、関数が戻る前に破棄されます)。

char * を返す代わりに、char * への参照をパラメーターとして渡し、ReadFromRegistry の外部でメモリを割り当てることができます。

于 2010-10-27T14:35:48.127 に答える