Search code examples
c++windowsregistrynpapiregistrykey

C++ read Registry


i try to read the Registry in my NPAPI-Plugin:

bool ScriptablePluginObject::Invoke(NPObject* obj, NPIdentifier methodName, const NPVariant* args, uint32_t argCount, NPVariant* result) {
    ScriptablePluginObject *thisObj = (ScriptablePluginObject*) obj;
    char* name                      = npnfuncs->utf8fromidentifier(methodName);
    LPCWSTR game_path               = getRegKey(L"SOFTWARE\\World of RPG", L"Path");

    MessageBox(NULL, game_path, L"Debugging", MB_TOPMOST);

    /* ... */
}

LPCWSTR ScriptablePluginObject::getRegKey(LPCWSTR location, LPCWSTR name) {
    HKEY hKey;
    LPBYTE folder   = new BYTE[MAX_PATH];
    DWORD dwSize    = sizeof(folder);
    long registry   = RegOpenKeyEx(HKEY_LOCAL_MACHINE, location, 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
    long entry      = RegQueryValueEx(hKey, name, NULL, REG_NONE, folder, &dwSize);

    if(registry != ERROR_SUCCESS) {
        return L"Error1";
    }

    if(entry != ERROR_SUCCESS) {
        return L"Error2";
    }

    RegCloseKey(hKey);
    folder[dwSize / sizeof(folder[0])] = '\0';
    return (LPCWSTR) folder;
}

But it's returned every call Error2. I've tried a lot of changes:

  • change the Path (with Start and/or Ending \\)
  • change parameters

I Want to get the Path of HKEY_LOCAL_MACHINE\SOFTWARE\World of RPG\Path:

enter image description here

Anyone can help me? What i'm doing wrong?


Solution

  • In getRegKey(), your folder variable is a pointer, so sizeof(folder) is 4 (if compiling for 32bit) or 8 (if compiling for 64bit). Thus RegQueryValueEx() fails with an ERROR_MORE_DATA error code.

    You are also using the wrong data type for the array. You need to use WCHAR instead of BYTE.

    Change this:

    LPBYTE folder   = new BYTE[MAX_PATH];
    DWORD dwSize    = sizeof(folder);
    

    To this:

    LPWSTR folder   = new WCHAR[MAX_PATH];
    DWORD dwSize    = sizeof(WCHAR) * MAX_PATH;
    

    With that said, you are leaking the memory pointed to by folder, since you never delete[] it.