c++ - 找不到RGBFilters入口点DllRegisterServer

标签 c++ visual-studio dll makefile directshow

我正在尝试使用多个摄像头构建DirectShow应用程序,这些摄像头可以在任意时间连接,断开连接或连接到预览监视器,而使应用程序的中央处理图处于运行状态。该架构如下所示:

target application architecture

this post(以及其他资源)的协助下,我开始工作了GMFBridge,以在程序启动时构造和连接源图和处理图,并在理论上运行这三个图。但是,由于没有附加渲染窗口,所以我真的不知道。

discovered的一件事是在Color Space Converter和渲染器之间需要Smart Tee过滤器,视频才能正常工作。因此,我假设Color Space Converter和网桥过滤器之间的Smart Tee过滤器将强制执行所需的视频格式。

现在,我正在尝试构建一个监视器窗口图,该图以桥源过滤器开始,并馈入渲染器。第一次尝试拒绝连接引脚,因为它们无法就媒体类型达成共识。 (异常中的错误消息是“这些引脚之间没有通用的媒体类型”。)我在它们之间放置了Color Space Converter,可以构建图形,但生成了黑色渲染器窗口。我使用GraphEdit连接到运行的图形,发现Color Space Converter输入的媒体类型为ARGB32,而输出为RGB565。我怀疑这是造成黑屏的原因,因此我寻找了一种使输出成为RGB32以匹配相机格式的方法。我发现无法直接设置Color Space Converter的输出格式,您必须将其连接到仅接受所需格式的过滤器。在this post中,我发现“来自RGBFilters示例的TransNull32确实做到了这一点。”

一旦意识到在系统上找不到TransNull32过滤器,我便开始寻找“神奇的” RGBFilters。在this post中,我找到了一个指向Wikipedia页面的链接,该页面具有包含RGBFilters源代码Windows Server 2003 R2 Platform SDK的Microsoft SDK最新版本的下载链接。

我从该镜像文件刻录了光盘,然后在系统上安装了SDK。当我转到RGBFilters目录时,我发现它具有Makefile,但是没有VC++或VisualStudio文件。我从Makefile创建了一个新的VisualStudio2015项目,并经历了调试其构建的过程:

  • StdAfx.h复制到所有子目录中;将(自动生成的)RGBFilters_h.h复制到RGBFilters.h并将其复制到所有子目录中,以解决编译器“未找到”错误
  • #include <strsafe.h>添加到StdAfx.h,然后将其重新复制到子目录
  • streams.h必须添加到包含列表中(来自我系统上的C:\Program Files\Microsoft\SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses)
  • Strmbasd.lib必须添加到库列表中(来自我系统上的C:\Program Files\Microsoft\SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Debug),并且必须使用与用于构建RGBFilters.dll时相同的字符集进行构建,这需要重建该库以及
  • winmm.lib必须添加到库列表中(来自我系统上的C:\Program Files\Microsoft\SDKs\Windows\v7.1\Lib)

  • 我终于建立了RGBFilters.dll,并尝试了regsvr32 RGBFilters.dll-并获得了

    regsvr32 RGBFilters.dll failure error message

    我以为我在this Microsoft post中找到了答案,但是我得到的是
    Sat 04/22/2017  8:48:00.27 Microsoft Windows [Version 6.1.7601]
    C:\...\RGBFilters\Debug > C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm RGBFilters.dll /tlb:RGBFilters.tlb
    Microsoft .NET Framework Assembly Registration Utility version 4.6.1055.0
    for Microsoft .NET Framework version 4.6.1055.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    RegAsm : error RA0000 : Failed to load 'C:\Program Files (x86)\Microsoft\wServer 2003 R2 Platform SDK\Samples\Multimedia\DirectShow\Filters\RGBFilters\Debug\RGBFilters.dll' because it is not a valid .NET assembly
    
    Sat 04/22/2017  8:56:02.02 Microsoft Windows [Version 6.1.7601]
    C:\...\RGBFilters\Debug >
    

    然后,按照this post中的建议,我尝试运行depends.exe,找不到类似于DLL导出列表的任何内容。我也试过
    Sat 04/22/2017 10:21:25.33 Microsoft Windows [Version 6.1.7601]
    C:\...\RGBFilters\Debug > dumpbin /exports RGBFilters.dll
    Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    
    Dump of file RGBFilters.dll
    
    File Type: DLL
    
      Summary
    
            1000 .00cfg
            7000 .data
            1000 .gfids
            2000 .idata
           22000 .rdata
            6000 .reloc
            1000 .rsrc
           59000 .text
    
    Sat 04/22/2017 10:21:38.61 Microsoft Windows [Version 6.1.7601]
    C:\...\RGBFilters\Debug >
    

    如您所见,此DLL中没有没有导出的符号-这就是为什么所有内容都在其中阻塞的原因。我浏览了VisualStudio中的所有项目设置,没有看到任何不对劲,所以我不知所措地解释了这个完全虚假的DLL是如何构建的。

    我强烈怀疑我是否错过了将Makefile转换为VS项目的关键步骤?

    编辑

    有一个RGBFilters.def文件,它被列为VS项目中的源文件之一,并且包含
    ;===========================================================================
    ;  Copyright (c) 1992-2002  Microsoft Corporation.  All Rights Reserved.
    ;===========================================================================
    
    EXPORTS
                DllMain                 PRIVATE
                DllGetClassObject       PRIVATE
                DllCanUnloadNow         PRIVATE
                DllRegisterServer       PRIVATE
                DllUnregisterServer     PRIVATE
    

    最佳答案

    Roman R所述,需要在项目属性的RGBFilters.def页面上的Module Definition File字段中引用Configuration Properties -> Linker -> Input文件。

    一旦对项目进行了更改并重新构建,regsvr32 RGBFilters.dll就可以按预期工作。

    关于c++ - 找不到RGBFilters入口点DllRegisterServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43560773/

    相关文章:

    c++ - 二进制 'operator' : no operator defined which takes a left-hand operand of type 'type' (or there is no acceptable conversion)

    c++ - 将 vector 拆分为唯一和重复 C++

    c# - 无法在 Visual Studio 2015 中添加项目引用

    c# - 在 View 中允许可空模型

    c++ - 当 UWP 调用我的 DLL 时,如何访问它的 RoamingState 文件夹?

    c++ - 为什么在多次或仅一次调用 CreateProcess 时会恰好泄漏两个句柄?

    c++ - QT Creator 在标题中定位 OpenCV 子标题时出错

    visual-studio - 在 Visual Studio 中是否有任何合并冲突的快捷键

    c# - VB6:如何创建 DLL 并在 C# 中使用它?

    c# - 如何将 cpp/cli 文件显式链接到 c# 库 .dll?