2012-05-31 54 views
0

我想在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)); 

的作品。

+0

使COM智能指針全局化是一個根本不好的想法,他們會在COM未初始化後調用Release()。您嘗試使用未初始化的指針只是挖掘一個更深的洞。不要試圖讓它變得全球化。 –

+0

那我該如何控制directshow圖呢?我必須在一個按鈕上創建它,然後用另一個按鈕啓動它,然後用另一個按鈕停止它,然後 – Grant

回答

0

這個問題似乎是,你沒有指定什麼聲明指針:

IGMFBridgeControllerPtr* pBridge2; 

你必須做一些事情,如:

pBridge2 = &m_pBridge; 

或者只是跳過使用pBridge2完全並改用&m_pBridge

+0

我不能在CLR中執行此操作。表達式 IGMFBridgeControllerPtr m_pBridge; 在CLR中是非法的,它必須有一個指針間接指向它,因爲它是全局的 – Grant