2010-10-27 36 views
0

過程中被損壞,我有以下的代碼,它從一個函數得到一個返回值char*的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 ""; 
} 
+1

ReadFromRegistry的代碼是什麼? – 2010-10-27 14:28:54

+0

這應該起作用,所以它在別的地方 - 請顯示實際的代碼塊。 – egrunin 2010-10-27 14:29:52

+0

@egrunin @Dark Falcon更新了有問題的代碼 – Simsons 2010-10-27 14:30:57

回答

5

我相信你是返回一個char *指向一個是在棧上分配的數組,即這條線:

TCHAR tSZValue[MAX_PATH] = {0}; 

依次爲:

char* cpRegKeyVal=tSZValue; 

這是危險的,你正在經歷第一手的最終結果!

編輯:你爲什麼不直接分配給一個CString的函數並返回?

+0

+1直接返回'CString'。 – 2010-10-27 15:02:26

+0

@Mark B:返回對象會導致不必要的複製。讓調用者將'char *'傳遞給調用者分配的存儲。 – 2010-10-27 18:58:54

+2

@Robert,那麼你可以通過引用傳入一個CString?保存你的自己努力處理字符緩衝區..我想這是一個品味的問題... – Nim 2010-10-27 19:03:49

5

該函數返回一個指針,其tSZValue是一個局部變量來,所以停止時它超出範圍存在。

0

您正在返回一個指針tSZValue,這是一個臨時變量,並且將在函數退出之後的某個覆蓋。

最簡單的解決方案:讓ReadFromRegistry()返回CString而不是char *

0

它看起來像ReadFromRegistry不分配內存返回值(或它的確如此,但它在堆棧上並在函數返回之前被銷燬)。

,而不是返回一個char *的,也許你可以通過在引用一個char *作爲參數,並分配ReadFromRegistry之外你的記憶。