0

CLR C++ で GMFBridge と DirectShow をコーディングしようとしています。同じソリューションで GMFBridgeLib と DirectShowLib のパフォーマンスを比較して、どちらがより効率的かを確認しようとしています。

現在、C++ キャプチャを設定するために GMFBridge ソース コードに従っています。私が抱えている問題の 1 つは、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 が、マネージドまたはアンマネージドに応じて * または ^ 何らかの形式のポインターでなければならないことを 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));

それが機能します。

4

1 に答える 1

0

問題は、宣言したポインターに何も割り当てていないことです。

IGMFBridgeControllerPtr* pBridge2;

次のようなことをしなければなりません:

pBridge2 = &m_pBridge;

pBridge2または、の使用を完全にスキップして、&m_pBridge代わりに使用してください。

于 2012-05-31T05:48:36.723 に答える