专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

不注册ffdshow.ax,如何在自己的代码使用它

发布时间:2011-06-27 19:15:38 文章来源:www.iduyao.cn 采编人员:星星草
不注册ffdshow.ax,怎么在自己的代码使用它?
网上查询了,基本上说的都是类似这个方法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

------解决方案--------------------
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: