2017-04-22 84 views
1

我试图用多个相机构建DirectShow应用程序,这些相机可能在任意时间连接,断开连接或连接到预览监视器,从而使应用程序的中央处理图运行。该体系结构是这样的:未找到RGBFilters入口点DllRegisterServer

target application architecture

this post(除其他资源)的协助下,我已经得到GMFBridge工作到源极图形和处理图构造的位置和连接在程序启动时,和三个图表理论上正在运行。但是,由于没有渲染窗口,所以我真的不知道。

沿途我的其中一个问题是Color Space Converter过滤器需要Smart Tee和呈现器之间的视频工作。因此,我假设Smart Tee和网桥过滤器之间有Color Space Converter过滤器,假设他们将执行所需的视频格式。

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

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

我从该映像文件中刻录了光盘,并在我的系统上安装了SDK。当我进入RGBFilters目录时,我发现它有一个Makefile但没有VC++或VisualStudio文件。我创建了一个新的VisualStudio2015项目从Makefile,并通过调试其构建的过程中去:

  • 副本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 
+0

为了让我不必下载一堆文件并启动Windows虚拟机,我只会问你。你有这个DLL的源代码 - 它是否在任何地方定义了一个'DllRegisterServer'函数?它是否以某种方式注释,以指示链接器它应该作为符号导出?一种常见的方式是在源代码中使用'__declspec(dllexport)'声明,但也可能是单独的[.DEF文件和'EXPORT'声明](https://msdn.microsoft .com/en-us/library/hyx1zcd3.aspx),当你创建一个新项目时,它并没有进行转换。 –

+1

.DEF应该是项目的一部分,并分别在项目设置中引用。像这样:http://imgur.com/download/eRH3rOp –

+0

14年是非常长的时间,这仍然编译和(可能)运行并不总是一个优势。 DirectShow已经死了,你应该专注于媒体基础。是的,可能是DEF文件。项目>属性>链接器>输入>模块定义文件设置。 –

回答

0

正如Roman R指出的那样,RGBFilters.def文件需要在Configuration Properties -> Linker -> Input页面的Module Definition File字段中的项目属性中引用。

一旦我对项目进行了更改并重建它,regsvr32 RGBFilters.dll按预期工作。