Невозможно заставить работать IApplicationAssociationRegistration :: QueryAppIsDefault - PullRequest
0 голосов
/ 04 марта 2010

Поэтому я пытаюсь использовать 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);

1 Ответ

1 голос
/ 04 марта 2010

Я repro (Win7 x86), я думаю, что главная проблема в том, что FirefoxHTML на самом деле не является ProgID. Важным подразделом для ProgID является ключ CLSID, он указывает на связанный подраздел HKCR \ Classes. Firefox довольно независим от COM.

...