我想在CLR C++中編譯GMFBridge和DirectShow。我試圖在相同的解決方案中將其性能與GMFBridgeLib和DirectShowLib進行比較,以查看哪個更有效。DirectShow CLR有全局變量的問題
現在我正在關注設置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;
}
從該行代碼
(*pBridge2).CreateInstance(__uuidof(GMFBridgeController));
,似乎工作是創建一個局部變量,是不是唯一的東西叫做comip.h線626一個點對象,但然後我不能將其設置爲全局,或跨GUI對象使用它。
,如果我讓地方:
IGMFBridgeControllerPtr pBridge;
pBridge.CreateInstance(__uuidof(GMFBridgeController));
的作品。
使COM智能指針全局化是一個根本不好的想法,他們會在COM未初始化後調用Release()。您嘗試使用未初始化的指針只是挖掘一個更深的洞。不要試圖讓它變得全球化。 –
那我該如何控制directshow圖呢?我必須在一個按鈕上創建它,然後用另一個按鈕啓動它,然後用另一個按鈕停止它,然後 – Grant