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));
それが機能します。