Поэтому я пытаюсь использовать IApplicationAssociationRegistration , который был представлен в Windows Vista. Я использую Windows 7 x64.
Однако каждый вызов, который получает ProgId (он же AppRegistryName, например, «FirefoxHTML»), возвращает HRESULT 0x80070002, что означает «Система не может найти указанный файл».
Такие вызовы, как QueryCurrentDefault, которые не нуждаются в / получают ProgId, но вместо этого возвращают один, работают безупречно.
Я в полной растерянности, какого типа файл здесь не найден, и я также не знаю, что еще может происходить.
Поскольку я не очень разбираюсь в COM, это может быть что-то очень глупое, что мне здесь не хватает. Спасибо за любой совет!
Вот скриншот:
http://i.imgur.com/x62y3.png
А вот грубый изолированный код, который вы, ребята, можете попробовать / воспроизвести, не забудьте установить точку останова:
#include <windows.h>
#include <tchar.h>
#include <shobjidl.h>
HRESULT CheckStuff(__out BOOL* pfHasDotHTM)
{
IApplicationAssociationRegistration* pAAR;
HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration,
NULL, CLSCTX_INPROC,
__uuidof(IApplicationAssociationRegistration),
(void**)&pAAR);
if (SUCCEEDED(hr))
{
hr = pAAR->QueryAppIsDefault(L".html",
AT_FILEEXTENSION, AL_EFFECTIVE,
L"FirefoxHTML",
pfHasDotHTM);
pAAR->Release();
}
return hr;
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
BOOL bx = FALSE;
CheckStuff(&bx);
CoUninitialize();
return 0;
}
Обновление 2:
Понял!
Ключ в том, что использование ProgId в качестве AppRegistryName совершенно неверно. Нужно использовать имя, зарегистрированное в HKEY_LOCAL_MACHINE \ SOFTWARE \ RegisteredApplications!
Рабочий пример:
hr = pAAR->QueryAppIsDefault(L".html",
AT_FILEEXTENSION,
AL_EFFECTIVE,
L"Firefox",
pfHasDotHTM);