我正在尝试在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));
有效。
答案 0 :(得分:0)
问题似乎是你没有为你声明的指针指定任何东西:
IGMFBridgeControllerPtr* pBridge2;
您必须执行以下操作:
pBridge2 = &m_pBridge;
或者完全跳过pBridge2
的使用,改为使用&m_pBridge
。