Nem tudom használni RegOpenKeyEx

szavazat
0

Nem tudom beállítani, olvasásával az adatbázis. Ez a funkció megkeresi a bejegyzések száma egy registry elérési útvonalát. Ez tökéletesen működik, én teszteltem:

void findNumberEntries(registryTest &INSTALLKEY) {

char buffer[50];
char size = sizeof(buffer);
int index = 0;

if(RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)(INSTALLKEY.regpath.c_str()),0,KEY_ALL_ACCESS,&INSTALLKEY.hKey) == ERROR_SUCCESS) {     

    DWORD readEntry;

    do {
        readEntry = RegEnumValue(INSTALLKEY.hKey,index,(LPTSTR)buffer,(LPDWORD)&size,NULL,NULL,NULL,NULL);
        index++;
    }
    while(readEntry != ERROR_NO_MORE_ITEMS);
}
INSTALLKEY.number = index;
RegCloseKey(INSTALLKEY.hKey);
}

Most, a fő funkciója:

std::string regpath32 = SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\;
struct registryTest {
HKEY hKey;
std::string regpath;
int number;
};

registryTest INSTALLKEY = {HKEY_LOCAL_MACHINE, regpath32};
findNumberEntries(INSTALLKEY);
printf(%d\n,INSTALLKEY.number);
system(PAUSE);
//until here everything works as it should

HKEY hKey = INSTALLKEY.hKey;
std::string regpath = INSTALLKEY.regpath;
char buffer[50];
char size = sizeof(buffer);
std::string bufferString;
DWORD regOpen = RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)INSTALLKEY.regpath.c_str(),0,KEY_READ,&INSTALLKEY.hKey);
if(regOpen == ERROR_SUCCESS) //this is the part that fails.
{
    printf(Registry Key was successfully opened\n);
}
else
{
    printf(Unable to open registry key\n);
    LPVOID message; 
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERT IGNORE S,
        NULL, GetLastError(), NULL,(LPTSTR) &message, 0, NULL );
    MessageBox(NULL,(LPCTSTR)message,ERROR,MB_OK|MB_ICONINFORMATION);
}

...rest of the code

Én mindig „Nem lehet megnyitni” és a hibaüzenet kapok „Nincs több fájlok”. Mi a probléma??

A kérdést 12/06/2011 14:15
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

Lehet, hogy adja meg KEY_ALL_ACCESSa második hívás is, ahelyett, hogy csak az első. És Win7 64 bites akkor is fut a regisztrációs átirányítani őrület (http://msdn.microsoft.com/en-us/library/aa384232%28VS.85%29.aspx).

EDIT: ah, talán csak kapok egy ERROR_CANTWRITE vissza (a hiba kódja 5). Akkor lehet, hogy figyelmen kívül hagyja ezt, és nézd meg, hogy még mindig működik.

Válaszolt 12/06/2011 14:27
a forrás felhasználó

szavazat
0

Nagyon valószínű, hogy a Windows 7 64 bites hogy folyamatban van irányítva keresztül Registry virtualizáció . Akkor meg mi kulcsokat irányítva hívja RegQueryReflectionKey .

Ha módosítja a kódot, hogy kiírja a tényleges egész érték, mely vissza hanem egy általános „Nem lehet megnyitni kulcsot”, akkor nem lenne hasznos. Például,

    long n = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("\\SOFTWARE"),
                      0,KEY_QUERY_VALUE, &hk );
    if ( n == ERROR_SUCCESS ) {
        cout << "OK" << endl;
    }
    else {
        cout << "Failed with value " << n << endl;
    }
Válaszolt 12/06/2011 14:29
a forrás felhasználó

szavazat
2

A probléma az, hogy amikor először nyitja meg a registry kulcsot, megadja azt HKEY-tagja a struct. Tehát a második alkalommal ebben HKEY nem tartalmazza az eredeti basekey többé.

változás :

DWORD regOpen = RegOpenKeyEx (INSTALLKEY.hKey, (LPTSTR) INSTALLKEY.regpath.c_str (), 0, KEY_READ, & INSTALLKEY.hKey);

-ba

DWORD regOpen = RegOpenKeyEx (HKEY_LOCAL_MACHINE, (LPTSTR) INSTALLKEY.regpath.c_str (), 0, KEY_READ, & INSTALLKEY.hKey);

vagy megváltoztatása:

void findNumberEntries( registryTest &INSTALLKEY)   
{
  char buffer[50];
  char size = sizeof(buffer); 
  int index = 0; 
  HKEY hkOpen = 0; // can't use INVALID_HANDLE_VALUE for HKEY's;

  if (RegOpenKeyEx( INSTALLKEY.hKey ,(LPTSTR)(INSTALLKEY.regpath.c_str())
                   ,0,&hkOpen ) == ERROR_SUCCESS) 
  {
      // You should use RegQueryInfoKey for below code !
      DWORD readEntry;      
      do {
         readEntry = RegEnumValue( hkOpen ,index,(LPTSTR)buffer
                       ,(LPDWORD size,NULL,NULL,NULL,NULL);
         index++;
     }
    while(readEntry != ERROR_NO_MORE_ITEMS); }
    INSTALLKEY.number = index;
    RegCloseKey( hkOpen );
 }
Válaszolt 12/06/2011 16:05
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more