DirectShow CLR遇到全局变量问题

时间:2012-05-31 00:38:58

标签: c++ clr directshow

我正在尝试在CLR C ++中编写GMFBridge和DirectShow。我试图在同一解决方案中将其性能与GMFBridgeLib和DirectShowLib进行比较,看看哪个更有效。

现在我正在关注用于设置C ++捕获的GMFBridge源代码。我遇到的一个问题是需要全局的对象,以便可以通过GUI按钮访问它们。 GMFBridge代码执行如下操作:

private:
IGMFBridgeControllerPtr m_pBridge;

然后在设置代码中使用,如下所示:

HRESULT hr = m_pBridge.CreateInstance(__uuidof(GMFBridgeController));

if (FAILED(hr))
{
    return hr;
}

// init to video-only, in discard mode (ie when source graph
// is running but not connected, buffers are discarded at the bridge)
hr = m_pBridge->AddStream(true, eMuxInputs, true);

我当前的问题是CLR声明任何全局都必须是某种形式的指针,*或^取决于托管或非托管。它不仅会让我添加一个全局变量,例如GMFBridge源代码。如果我创建一个指针:

IGMFBridgeControllerPtr* pBridge2;

并尝试在我的GUI代码中使用它:

(*pBridge2).CreateInstance(__uuidof(GMFBridgeController));
(*pBridge2).AddStream(true, eMuxInputs, true);

它确实编译,但是当我运行它时,代码崩溃了

An unhandled exception of type 'System.NullReferenceException' occurred in Program.exe.

Addidional information: Object reference not set to an instance of an object.

代码块

void _Release() throw()
{
    if (m_pInterface != NULL) {            <--------------
        m_pInterface->Release();
    }
}

在comip.h第823行中调用:

HRESULT CreateInstance(const CLSID& rclsid, IUnknown* pOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) throw()
{
    HRESULT hr;

    _Release();

    if (dwClsContext & (CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)) {   <----------
        IUnknown* pIUnknown;
        hr = CoCreateInstance(rclsid, pOuter, dwClsContext, __uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown));

        if (SUCCEEDED(hr)) {
            hr = OleRun(pIUnknown);

            if (SUCCEEDED(hr)) {
                hr = pIUnknown->QueryInterface(GetIID(), reinterpret_cast<void**>(&m_pInterface));
            }

            pIUnknown->Release();
        }
    }
    else {
        hr = CoCreateInstance(rclsid, pOuter, dwClsContext, GetIID(), reinterpret_cast<void**>(&m_pInterface));
    }

    if (FAILED(hr)) {
        // just in case refcount = 0 and dtor gets called
        m_pInterface = NULL;
    }

    return hr;
}

comip.h第626行从这行代码中调用

(*pBridge2).CreateInstance(__uuidof(GMFBridgeController));

唯一可行的方法是创建一个不是点对象的局部变量,但是我无法将其设置为全局变量,或者在GUI对象中使用它。

如果我将其设为本地:

IGMFBridgeControllerPtr pBridge;
pBridge.CreateInstance(__uuidof(GMFBridgeController));

有效。

1 个答案:

答案 0 :(得分:0)

问题似乎是你没有为你声明的指针指定任何东西:

IGMFBridgeControllerPtr* pBridge2;

您必须执行以下操作:

pBridge2 = &m_pBridge;

或者完全跳过pBridge2的使用,改为使用&m_pBridge