Как-то так:

Получение значений из реестра (пример выдран из работающей функции и немного упрощен)
Код:
// Путь к ключу, ветка
TCHAR* currentKey = TEXT("SOFTWARE\\Abracadabra\\Path\\"));
HKEY* currentHKey = new HKEY(); // дескриптор ветки
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                     currentKey,
                     0,
                     KEY_READ,
	        currentHKey);
DWORD size; // Длина значения
    //  Дважды вызываем RegQueryValueEx, сначала получим длину значения,
    // потом получаем само значение в выделенный буфер
	DWORD retCode = RegQueryValueEx(
		*(hkey),
		L"UninstallString",
		NULL,
		NULL,
		NULL,
		&size
		);

    // Проверим есть ли значение
	if (retCode != ERROR_SUCCESS)
		return;

    // Выделяем буфер для значения
    TCHAR* value = new TCHAR[size];
    // Получаем значение
	retCode = RegQueryValueEx(
		*(hkey),
		L"UninstallString",
		NULL,
		NULL,
		(LPBYTE)value,
		&size
		);
Простой вариант запуска:
Код:
if((UINT)ShellExecute(hwnds::hWnd, L"open",
                              "app.exe", NULL, NULL, SW_SHOWNORMAL) <= 32) 
; // Не удалось запустить приложение...
Само собой ТС это уже не нужно xD Но мало ли кому-то другому пригодится.