基于 Directshow 应用程序无法启动,提示 “应用程序配置不正确,重新安装...”———— DeleteMediaType()存在连接问题

      在借助Directshow编写应用程序的时候,遇到了这样一个问题,那就是我编写出来的AP,在我自己的机子上是好的,但是一旦复制到别的机子上会出现无法运行的情况,提示为“应用程序配置不正确,重新安装可能会解决该问题”。

      尝试了很久,也换了不同的SDKs库文件,发现发布出来的应用程序还是存在这样的问题,google了一下,发现有类似的问题存在:http://www.cnblogs.com/cyrys/archive/2006/11/15/560976.html

      尝试了文中所提到的方法,问题成功解决。

 

void MyDeleteMediaType(AM_MEDIA_TYPE *pmt) { if (pmt != NULL) { MyFreeMediaType(*pmt); // See FreeMediaType for the implementation. CoTaskMemFree(pmt); } } void MyFreeMediaType(AM_MEDIA_TYPE& mt) { if (mt.cbFormat != 0) { CoTaskMemFree((PVOID)mt.pbFormat); mt.cbFormat = 0; mt.pbFormat = NULL; } if (mt.pUnk != NULL) { // Unecessary because pUnk should not be used, but safest. mt.pUnk->Release(); mt.pUnk = NULL; } }

 

具体就是使用以上的 MyDeleteMediaType() 代替库中的 DeleteMediaType() .

 

在DirectShow的文档中有:

void WINAPI DeleteMediaType( AM_MEDIA_TYPE *pmt ); Parameters pmt Pointer to an AM_MEDIA_TYPE structure. Return Value No return value. Remarks Use this function to release any media type structure that was allocated using either CoTaskMemAlloc or CreateMediaType. If you prefer not to link to the base class library, you can use the following code directly: void MyDeleteMediaType(AM_MEDIA_TYPE *pmt) { if (pmt != NULL) { MyFreeMediaType(*pmt); // See FreeMediaType for the implementation. CoTaskMemFree(pmt); } }

可以看到,它适用于由 CoTaskMemAlloc or CreateMediaType分配产生的media type。

在应用中,我采用了

HRESULT STDMETHODCALLTYPE IAMStreamConfig::GetStreamCaps( /* [in] */ int iIndex, /* [out] */ __out AM_MEDIA_TYPE **ppmt, /* [out] */ __out BYTE *pSCC)

来分配产生media type, 结果在使用DeleteMediaType()释放时产生错误。

采用上述的 MyDeleteMediaType() 成功解决此问题。

 

DeleteMediaType()代码如下:

void WINAPI DeleteMediaType(__inout_opt AM_MEDIA_TYPE *pmt) { // allow NULL pointers for coding simplicity if (pmt == NULL) { return; } FreeMediaType(*pmt); CoTaskMemFree((PVOID)pmt); }

void WINAPI FreeMediaType(__inout AM_MEDIA_TYPE& mt) { if (mt.cbFormat != 0) { CoTaskMemFree((PVOID)mt.pbFormat); // Strictly unnecessary but tidier mt.cbFormat = 0; mt.pbFormat = NULL; } if (mt.pUnk != NULL) { mt.pUnk->Release(); mt.pUnk = NULL; } }

 

谢谢 : http://www.cnblogs.com/cyrys/archive/2006/11/15/560976.html

你可能感兴趣的:(function,null,library,structure,winapi,Pointers)