CoCreateInstance上的E_ACCESSDENIED

时间:2010-05-18 13:55:47

标签: com directshow

以下是代码段

#include "stdafx.h"
#include <tchar.h>
#include <windows.h>
#include <dshow.h>
#include <ExDisp.h>
int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    HRESULT hr = S_OK;
    DWORD err = 0;

    // Try to create graph builder
    IGraphBuilder* pGraph = 0;
    hr = CoCreateInstance(CLSID_FilterGraph, NULL,
    CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph );
    err = GetLastError();

    // Here, hr is E_ACCESSDENIED
    // err is 5 (ERROR_ACCESS_DENIED)
    // Try to create capture graph builder (succeeds)
    ICaptureGraphBuilder2* pBuild = 0;
    hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void **)&pBuild );
    err = GetLastError();

    // Here, hr is S_OK
    // err is 0 (ERROR_SUCCESS)
    // Try to create IWebBrowser (succeeds)
    IWebBrowser2* pBrowser = 0;
    hr = CoCreateInstance (CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (LPVOID *)&pBrowser);

    err = GetLastError();

    // Here, hr is S_OK
    // err is 0 (ERROR_SUCCESS)
    return 0;
}

我正在尝试创建IFilterGraph,它因E_ACCESSDENIED而失败。另一方面,创建其他directshow对象可以正常工作。与其他一些COM对象相同(以IWebBrowser2为例)。知道可能是什么问题吗?谢谢!

1 个答案:

答案 0 :(得分:3)

嗯,这看起来不太好。这是Windows安全问题的结果。这通常不会失败,coclass存在于c:\ windows \ system32 \ quartz.dll中。有许多可能导致失败的操作,包括在读取注册表和加载DLL时遇到问题。

对它进行故障排除的最佳方法可能是使用SysInternals的ProcMon并观察程序的操作。注意Result列,你应该看到那里的错误。这应该让你更接近找出可能是什么安全配置问题。