【问题标题】:E_ACCESSDENIED on CoCreateInstanceCoCreateInstance 上的 E_ACCESSDENIED
【发布时间】:2010-05-18 13:55:47
【问题描述】:

这是一个代码sn-p

#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 为例)。知道可能是什么问题吗?谢谢!

【问题讨论】:

    标签: com directshow


    【解决方案1】:

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

    也许解决它的最佳方法是使用 SysInternals 的 ProcMon 并观察程序的操作。注意 Result 列,您应该在那里看到错误。这应该让您更接近找出可能是什么安全配置问题的根源。

    【讨论】:

    • 非常真实,我用它调试了许多看起来很奇怪的问题。我想一个链接会非常有用:technet.microsoft.com/en-us/sysinternals/bb896645.aspx
    • 谢谢,我完全忘记了 ProcMon 可以在这里提供帮助。其中一个 dll 是从我的用户没有权限的文件夹中注册的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2013-01-28
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多