2012-05-08 225 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。