网上查询了,基本上说的都是类似这个方法http://blog.csdn.net/mjh1021/article/details/5468150
但不知道为什么,我的代码里总是Addfilter失败,难道是我下载的ffdshow.ax有问题。
还有个问题,ffdshow一般都包括了video和audio解码,我怎么去区分使用它(如果需要手动连接就需要区分是什么filter了),难道我只要成功Addfilter了就可以了吗?
用了动态加载是不是不能使用智能连接(RenderFile),还是只能使用手动链接他?
------解决方案--------------------
1)在FFDShow的配置里把自己的程序加进去。
2)如果只需要ffdshow的vdieo、audio解码器,成功Addfilter是第1步,剩下的就是用ICaptureGraphBuilder2把各个Filter成功连接起来。
3)用了动态加载,一般就不用智能连接了,而且智能连接在性能上比手动链接要差些。
------解决方案--------------------
刚才回另一个帖子了,你也试试:
BOOL SafeRegisterFilter(char* pchControlFilePath)
{
BOOL bRegOK = FALSE;
HINSTANCE hInst = LoadLibrary(pchControlFilePath);
if (hInst)
{
typedef HRESULT (*DLLREGISTERSERVER)();
DLLREGISTERSERVER DllRegisterServer = (DLLREGISTERSERVER)GetProcAddress(hInst, "DllRegisterServer");
if (DllRegisterServer)
{
DllRegisterServer();
bRegOK = TRUE;
}
FreeLibrary(hInst);
}
return bRegOK;
}
SafeRegisterFilter("aaa.ax");
试一下这个函数行不行。
再或者,在程序里调用 regsvr32("aaa.ax")。
------解决方案--------------------
"有个问题啊,机子在安装了FFDSHOW之后才会弹出属性设置页,"
你没看到 XunLei 里面有 FFdshow 的东西吗?人家没安装啊,
- C/C++ code
#ifndef COMUtility_H #define COMUtility_H ////////////////////////////////////////////////////////////////////////// #include <Windows.h> ////////////////////////////////////////////////////////////////////////// // define the prototype of the class factory entry point in a COM dll typedef HRESULT (STDAPICALLTYPE *DllGetClassObjectT)(REFCLSID clsid, REFIID iid, LPVOID *ppv); ////////////////////////////////////////////////////////////////////////// template <DWORD dwUnique> class COMUtilityT { public: static HRESULT CreateObjectFromPath(REFCLSID clsid, IUnknown **ppUnk, LPCSTR lpszPath) { // load the target DLL directly HMODULE hModule = LoadLibraryA(lpszPath); if (hModule == NULL) { return HRESULT_FROM_WIN32(GetLastError()); } return CreateObjectFromPath(hModule, clsid, ppUnk); } static HRESULT CreateObjectFromPath(REFCLSID clsid, IUnknown **ppUnk, LPCWSTR lpszPath) { // load the target DLL directly HMODULE hModule = LoadLibraryW(lpszPath); if (hModule == NULL) { return HRESULT_FROM_WIN32(GetLastError()); } return CreateObjectFromPath(hModule, clsid, ppUnk); } private: static HRESULT CreateObjectFromPath(HMODULE hModule, REFCLSID clsid, IUnknown **ppUnk) { if (hModule == NULL) { return HRESULT_FROM_WIN32(GetLastError()); } // the entry point is an exported function DllGetClassObjectT fn = (DllGetClassObjectT) GetProcAddress(hModule, "DllGetClassObject"); if (fn == NULL) { return HRESULT_FROM_WIN32(GetLastError()); } // create a class factory CComPtr<IUnknown> pUnknown; HRESULT hr = fn(clsid, IID_IUnknown, (LPVOID *) &pUnknown); if (SUCCEEDED(hr)) { CComQIPtr<IClassFactory> pClassFactory(pUnknown); if (pClassFactory == NULL) { hr = E_NOINTERFACE; } else { // ask the class factory to create the object hr = pClassFactory->CreateInstance(NULL, IID_IUnknown, (LPVOID *) ppUnk); } } return hr; } }; ////////////////////////////////////////////////////////////////////////// typedef COMUtilityT<0> COMUtility; ////////////////////////////////////////////////////////////////////////// #endif
------解决方案--------------------