gpt4 book ai didi

c++ - 使用自定义 DirectShow 过滤器(DLL,已注册)

转载 作者:搜寻专家 更新时间:2023-10-31 01:20:21 28 4
gpt4 key购买 nike

我编写了一个小型变换过滤器(派生自 TransInPlaceFilter 基类),并设法使其在 Directshow 图中正常工作,完全用 C++ 编码。我基本上遵循了 MSDN 中描述的前 5 个步骤,以及第 6 步的最后一部分(以便直接在应用程序中使用过滤器)。

出于很多原因(包括能够在 GraphEdit 中使用过滤器),我需要将该过滤器导出到 DLL 中并进行注册。

我一直在努力关注these steps :设置“CreateInstance”方法、CFactoryTemplate 类、过滤器/引脚描述(AMOVIESETUP_FILTER、AMOVIESETUP_PIN、AMOVIESETUP_MEDIA)、注册/注销函数,最后是 DLLmain/入口点。

代码成功编译并提供了一个 DLL,使用 Regsvr32 似乎可以毫无问题地注册。

但是我无法使用过滤器:

  • 它出现在 GraphEdit 的列表中,但当我尝试插入它时失败:0x800401f9(“DLL 中的错误”)。
  • 当我尝试用 C++ 创建它时(使用 pCustomFilter.CoCreateInstance(CLSID_Custom),在定义正确的 GUID 之后),我收到错误 0x80040154 (REGDB_E_CLASSNOTREG)

我在这里很困惑。我是否遗漏了 DLL/注册代码中的某些内容?如果有任何用处,我将发布我正在使用的大部分代码。

如有任何帮助,我们将不胜感激。

static const WCHAR g_wszName[] = L"Custom Filter";

AMOVIESETUP_MEDIATYPE sudMediaTypes[] = {
{ &MEDIATYPE_Video, &MEDIASUBTYPE_NULL },
{ &MEDIATYPE_Audio, &MEDIASUBTYPE_NULL },
};

AMOVIESETUP_PIN sudPins[2] = {
{
L"Input", // Name
FALSE, // Is this pin rendered?
FALSE, // Is it an output pin?
FALSE, // Can the filter create zero instances?
FALSE, // Does the filter create multiple instances?
&GUID_NULL, // Obsolete.
NULL, // Obsolete.
2, // Number of media types.
sudMediaTypes // Pointer to media types.
},
{
L"Output", // Name
FALSE, // Is this pin rendered?
TRUE, // Is it an output pin?
FALSE, // Can the filter create zero instances?
FALSE, // Does the filter create multiple instances?
&GUID_NULL, // Obsolete.
NULL, // Obsolete.
2, // Number of media types.
sudMediaTypes // Pointer to media types.
}
};

AMOVIESETUP_FILTER sudFilterReg = {
&CLSID_Custom, // Filter CLSID.
g_wszName, // Filter name.
MERIT_DO_NOT_USE, // Merit.
2, // Number of pin types.
sudPins // Pointer to pin information.
};


CFactoryTemplate g_Templates[] =
{
{
g_wszName,
&CLSID_Custom,
CCustomFilter::CreateInstance,
NULL,
&sudFilterReg
}
};

int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);

STDAPI DllRegisterServer()
{
return AMovieDllRegisterServer2( TRUE );
}
STDAPI DllUnregisterServer()
{
return AMovieDllRegisterServer2( FALSE );
}


extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);

BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpReserved)
{
return DllEntryPoint(reinterpret_cast<HINSTANCE>(hDllHandle), dwReason, lpReserved);
}

// ---
// Meanwhile, in my filter class...
// ---
CUnknown * WINAPI CCustomFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
CCustomFilter *pFilter = new CCustomFilter();
if (pFilter== NULL)
{
*pHr = E_OUTOFMEMORY;
}
return pFilter;
}

最佳答案

问题解决了。这实际上是两件事:

<醇>
  • 直接调试 DLL(我没想到的东西...),更具体地说是 CoCreateInstance 函数,帮助我注意到字符串宏的问题。调用 TransInPlaceFilter 的构造函数时使用了错误的参数,这导致了崩溃。

  • 有人让我注意到我没有导出所有必需的函数(如 MSDN 上的 here 所述)。我的 .def 文件缺少 DllMain、DllGetClassObject 和 DllCanUnloadNow。最后两个函数只需要出现在 def 中,因为它们已经在基类库中定义。

  • `

    LIBRARY "custom_filter"
    EXPORTS
    DllMain PRIVATE /* missing */
    DllGetClassObject PRIVATE /* missing */
    DllCanUnloadNow PRIVATE /* missing */
    DllRegisterServer PRIVATE
    DllUnregisterServer PRIVATE

    非常感谢您的帮助!

    关于c++ - 使用自定义 DirectShow 过滤器(DLL,已注册),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4969916/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com