我正在玩DirectShow
过滤器,从这里:http://tmhare.mvps.org/downloads.htm。如果在Windows1064位计算机上使用包含的二进制文件,则示例Capture Source Filter
可以正常工作。
相反,当我尝试注册过滤器时,重新编译源代码会导致以下错误:
模块“.”已加载,但未找到入口点DllRegisterServer。
据我所知,这可能是由于架构中的一些不匹配造成的。
我就是这样做的:
BaseClasses
编译了x86_MT和x64_MT库。Capture Source Filter
源文件,添加了前面点的包含和库的正确路径,将代码生成设置为MT,并重新构建了x86_MT和x64_MT。DirectShow Filter Manager
(http://www.softella.com/dsfm/index.en.htm)注册输出过滤器--它在预编译器二进制文件中工作得很好。当然,在尝试使用新编译的过滤器之前,我已经注销了旧的过滤器。Dependency Walker
似乎没说什么有趣的话。它抱怨缺少了很多API-MS-WIN*.dll
,但它们实际上是在文件系统上,而且无论如何,这些错误也适用于工作的二进制文件。
在这一点上,为了避免随机试验,应该做些什么来缩小错误的来源?有什么工具可以帮助我理解我错在哪里吗?
更新
我找到了问题的根源:原始代码使用一个def
文件来导出函数,但实际上并没有导出它们。这是def
文件:
LIBRARY Vcam.ax
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
但是,仅将该文件添加到源中是不够的。阅读这里的其他帖子让我明白,我需要使用__declspec(dllexport)
而不是def
文件。
因此,我用以下代码为dll.cpp添加了一个头文件:
#pragma once
#include <winnt.h>
#include <minwindef.h>
#define DLLEXPORT __declspec(dllexport)
STDAPI DLLEXPORT DllRegisterServer();
STDAPI DLLEXPORT DllUnregisterServer();
DLLEXPORT BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved);
STDAPI DLLEXPORT DllCanUnloadNow();
STDAPI DLLEXPORT DllGetClassObject(__in REFCLSID rClsID, __in REFIID riid, __deref_out void **pv);
但是dumpbin
仍然告诉我,函数不是导出的。
发布于 2017-03-21 18:55:50
发布于 2017-03-21 21:54:00
模块“.”已加载,但未找到入口点DllRegisterServer。
有了这样的错误依赖,Walker应该能够确认DllRegisterServer
是否可用--该实用程序显示导出的函数。
如果导出函数,问题可能是依赖关系或错误比特,这是导致无法LoadLibrary
DLL的问题。
如果函数没有导出,项目很可能丢失一个.DEF文件,或者没有定义可导出的符号(例如使用#pragma
)。
https://stackoverflow.com/questions/42930606
复制相似问题