Com 无法使IAApplicationAssociationRegistration::QueryAppIsDefault正常工作

Com 无法使IAApplicationAssociationRegistration::QueryAppIsDefault正常工作,com,winapi,windows-vista,Com,Winapi,Windows Vista,所以我尝试使用Windows Vista中引入的。我使用的是Windows7x64 但是,每个接收ProgId(又名AppRegistryName,例如“FirefoxHTML”)的调用都会返回一个HRESULT 0x80070002,这意味着“系统找不到指定的文件”。 像QueryCurrentDefault这样的调用不需要/接收ProgId,而是返回一个ProgId,可以完美地工作。 我完全不知道这里找不到什么样的文件,我也不知道还会发生什么 因为我不太喜欢COM的东西,所以我可能错过了一些

所以我尝试使用Windows Vista中引入的。我使用的是Windows7x64

但是,每个接收ProgId(又名AppRegistryName,例如“FirefoxHTML”)的调用都会返回一个HRESULT 0x80070002,这意味着“系统找不到指定的文件”。 像QueryCurrentDefault这样的调用不需要/接收ProgId,而是返回一个ProgId,可以完美地工作。 我完全不知道这里找不到什么样的文件,我也不知道还会发生什么

因为我不太喜欢COM的东西,所以我可能错过了一些非常愚蠢的东西。谢谢你的建议

以下是一个屏幕截图:

下面是供大家尝试/复制的原始独立代码,别忘了设置断点:

#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;
}

我重新编程(Win7 x86),我认为主要的问题是FirefoxHTML实际上不是一个ProgID。ProgID的一个基本子键是CLSID键,它指向关联的HKCR\Classes子键。Firefox是完全不可知论的。

嘿,谢谢,但不要说这样的话:o不过,我会考虑添加一个GUID/CLSID,看看它是否会改变什么。顺便说一下,FirefoxHTML只是一个例子,我们将使用特定于我们的应用程序的ProgId。也许你应该给出一个更好的例子。
    hr = pAAR->QueryAppIsDefault(L".html",
        AT_FILEEXTENSION,
        AL_EFFECTIVE,
        L"Firefox",
        pfHasDotHTM);