尝试设置默认浏览器时为0x80070002

时间:2013-11-24 17:48:57

标签: c++ windows com

我正在尝试在Windows上设置默认浏览器。我确实让它工作了,然后由于某种原因它停止了我重构我的代码而我无法解决原因(并且我不能遗漏旧代码)。

这是我写的一个测试,我认为应该有效:

#include <windows.h>
#include <Shobjidl.h>

void test()
{
    // Included because they aren't defined in mingw for some reason.
    const GUID CLSID_ApplicationAssociationRegistration =
        { 0x591209c7, 0x767b, 0x42b2, {0x9f,0xba,0x44,0xee,0x46,0x15,0xf2,0xc7} };

    const IID IID_ApplicationAssociationRegistration =
        { 0x4e530b0a, 0xe611, 0x4c77, {0xa3,0xac,0x90,0x31,0xd0,0x22,0x28,0x1b} };

    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    IApplicationAssociationRegistration* pAAR;

    HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration,
                                  NULL,
                                  CLSCTX_INPROC,
                                  IID_ApplicationAssociationRegistration,
                                  (void**)&pAAR);
    if (FAILED(hr))
    {
        qDebug() << "CoCreateInstance failed: " << hr;
        return;
    }

    hr = pAAR->SetAppAsDefault(L"IE.HTTP", L"http", AT_URLPROTOCOL);

    if (FAILED(hr))
    {
        qDebug() << "SetAppAsDefault failed: " << hr;
        pAAR->Release();
        return;
    }

    pAAR->Release();

    qDebug() << "Success";
    return;
}

我得到"SetAppAsDefault failed: -2147024894"(0x80070002)。请注意CoCreateInstance 工作(或至少声称)。

有什么想法吗?我尝试将COINT_APARTMENTTHREADED更改为其他各种值,CLSCTX_INPROC也是如此。他们都没有工作。请解释一下你的答案,好像我之前从未使用过COM,并且不想用它填满我的大脑!即我不知道编组,公寓等是什么。

我80%确定与此非常相似的工作......

更新:对不起,我之前说过它给了E_NOINTERFACE这是完全错误的 - 不知道为什么我这么认为。 0x80070002似乎没有任何东西......

更新2 :0x80070002表示“系统找不到指定的文件”。根据FormatMessage。我不知道在这种情况下这有什么意义。

1 个答案:

答案 0 :(得分:0)

使用默认浏览器时,请遵循Microsoft的指导原则,因为在许多操作系统版本上会遇到许多问题。

http://msdn.microsoft.com/en-us/library/windows/desktop/cc144154(v=vs.85).aspx#browser