2
votes

I'm trying to get details about installed applications in my post. And, I'm getting the below errors:

Code:

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

using namespace std;

#ifdef _UNICODE
#define tcout       wcout
#define tstring     wstring
#else
#define tcout       cout
#define tstring     string
#endif

tstring RegistryQueryValue(HKEY hKey,
    LPCTSTR szName)
{
    tstring value;

    DWORD dwType;
    DWORD dwSize = 0;

    if (::RegQueryValueEx(
        hKey,                   // key handle
        szName,                 // item name
        NULL,                   // reserved
        &dwType,                // type of data stored
        NULL,                   // no data buffer
        &dwSize                 // required buffer size
        ) == ERROR_SUCCESS && dwSize > 0)
    {
        value.resize(dwSize);

        ::RegQueryValueEx(
            hKey,                   // key handle
            szName,                 // item name
            NULL,                   // reserved
            &dwType,                // type of data stored
            (LPBYTE)&value[0],      // data buffer
            &dwSize                 // available buffer size
            );
    }

    return value;
}

void RegistryEnum()
{
    HKEY hKey;
    LONG ret = ::RegOpenKeyEx(
        HKEY_LOCAL_MACHINE,     // local machine hive
        __TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"), // uninstall key
        0,                      // reserved
        KEY_READ,               // desired access
        &hKey                   // handle to the open key
        );

    if (ret != ERROR_SUCCESS)
        return;

    DWORD dwIndex = 0;
    DWORD cbName = 1024;
    TCHAR szSubKeyName[1024];

    while ((ret = ::RegEnumKeyEx(
        hKey,
        dwIndex,
        szSubKeyName,
        &cbName,
        NULL,
        NULL,
        NULL,
        NULL)) != ERROR_NO_MORE_ITEMS)
    {
        if (ret == ERROR_SUCCESS)
        {
            HKEY hItem;
            if (::RegOpenKeyEx(hKey, szSubKeyName, 0, KEY_READ, &hItem) != ERROR_SUCCESS)
                continue;

            tstring name = RegistryQueryValue(hItem, __TEXT("DisplayName"));
            tstring publisher = RegistryQueryValue(hItem, __TEXT("Publisher"));
            tstring version = RegistryQueryValue(hItem, __TEXT("DisplayVersion"));
            tstring location = RegistryQueryValue(hItem, __TEXT("InstallLocation"));

            if (!name.empty())
            {
                tcout << name << endl;
                tcout << "  - " << publisher << endl;
                tcout << "  - " << version << endl;
                tcout << "  - " << location << endl;
                tcout << endl;
            }

            ::RegCloseKey(hItem);
        }
        dwIndex++;
        cbName = 1024;
    }
    ::RegCloseKey(hKey);
}

void main(){
    RegistryEnum();
}

Errors:

LNK1120: 5 unresolved externals

LNK2019: unresolved external symbol _imp_RegCloseKey@4 referenced in function "void __cdecl RegistryEnum(void)" (?RegistryEnum@@YAXXZ)

LNK2019: unresolved external symbol _imp_RegEnumKeyExW@32 referenced in function "void __cdecl RegistryEnum(void)" (?RegistryEnum@@YAXXZ)

LNK2019: unresolved external symbol _imp_RegOpenKeyExW@20 referenced in function "void __cdecl RegistryEnum(void)" (?RegistryEnum@@YAXXZ)

LNK2019: unresolved external symbol imp__RegQueryValueExW@24 referenced in function "class std::basic_string,class std::allocator > __cdecl RegistryQueryValue(struct HKEY *,wchar_t const *)" (?RegistryQueryValue@@YA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@W@2@@std@@PAUHKEY_@@PB_W@Z)

LNK2019: unresolved external symbol wWinMain@16 referenced in function __tmainCRTStartup

How may I fix this please?

1
They are Linking related errors. Add Advapi32.lib in Additional dependancy tab (or whatever they name it nowadays). Errors say that IDE cannot find the library with functions mentioned.SChepurin
I've tried to add it like this, #pragma comment(lib, "Advapi32.lib")user3296338
Okay. It builds fine in VC++2010. Nothing fancy.SChepurin
@SChepurin, is this coming from VS2013? Libraries linking?user3296338
Nothing else. IDE cannot find the Advapi32.lib.SChepurin

1 Answers

5
votes

You must link with the Advapi32.lib.