2012-05-08 278 views
1

我目前正在學習如何使用C++使用註冊表。我已經提出了一個應用程序,該應用程序應該可以查看某個鍵中是否存在某個值。但是,應用程序一旦達到RegEnumValue(),就會崩潰。任何想法可能是什麼問題?RegEnumValue崩潰應用程序

代碼:

#include <iostream> 
#include <windows.h> 
#include <Psapi.h> 

using namespace std; 

bool registerKeyExists(char* key, char* subkey); 

int main() 
{ 
    while(true){ 
     if(registerKeyExists("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", "SynTPEnh")){ 
      return 0; 
     } 
    } 

    return 0; 
} 

bool registerKeyExists(char* key, char* subkey){ 
    HKEY keyEnum; 
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &keyEnum) == ERROR_SUCCESS){ 
     char* valueName; 
     DWORD valueSize = 100; 
     DWORD cbName; 
     FILETIME lastFiletime; 
     DWORD i = 0; 
     DWORD returnCode = ERROR_SUCCESS; 
     while(returnCode == ERROR_SUCCESS){ 
      cout << "This show!" << endl; 
      returnCode = RegEnumValue(keyEnum, i, valueName, &valueSize, NULL, NULL, NULL, NULL); 
      cout << "This doesn't show!" << endl; 
      if(valueName == subkey) 
       return true; 
      i++; 
     } 
    } 
    return false; 
} 

回答

5

您還沒有該值的名稱提供的任何空間。你正在傳遞一個未初始化的指針valueNameRegEnumValue(),它拒絕(顯然,通過崩潰你的應用程序)。請嘗試改爲:

char valueName[100]; 
DWORD valueSize = sizeof(valueName); 

這爲返回的值名稱保留了100個字符。

你也想用strcmp()而不是==測試字符串值:

if (strcmp(valueName, subkey) == 0) ... 
+0

不要忘了比較尺寸! 'strlen(valueName)== strlen(subkey)' –

+0

@KlemensBaum:使用'strcmp()'時不需要比較大小。如果長度不同,'strcmp()'不會返回0. –

+0

啊,謝謝!現在它運行完美! – Anton

3

從SDK機制的文檔的RegEnumValue():在lpValueName

LONG WINAPI RegEnumValue(
    __in   HKEY hKey, 
    __in   DWORD dwIndex, 
    __out  LPTSTR lpValueName,   // <=== here 
    __inout  LPDWORD lpcchValueName, 
    __reserved LPDWORD lpReserved, 
    __out_opt LPDWORD lpType, 
    __out_opt LPBYTE lpData, 
    __inout_opt LPDWORD lpcbData 
); 

通知的__out SAL註釋論據。這意味着「要通過你提供的指針」。尤其是,請編寫SDK文章其餘部分所述的值的名稱。

問題是,您沒有傳遞指向可寫入內存的初始化指針。一個TCHAR []數組,足夠大以接收字符串,如下一個參數lpcchValueName所示。你沒有初始化它。並說你分配了100個字符的數組。

Kaboom。