我正在使用来自这里的 DirectShow
过滤器:http://tmhare.mvps.org/downloads.htm .
如果我在 Windows 10 64 位计算机上使用包含的二进制文件,示例 Capture Source Filter
工作正常。
相反,当我尝试注册过滤器时,重新编译源代码会导致以下错误:
The module "..." was loaded but the entry-point DllRegisterServer was not found.
据我所知,这可能是由于架构不匹配造成的。
这是我做的:
从这里:https://github.com/cplussharp/graph-studio-next ,我为
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
仍然告诉我函数没有导出。
最佳答案
这里描述了如何使用def
文件:
https://msdn.microsoft.com/en-us/library/34c30xs1.aspx
缺少的步骤是将其添加到属性页 > 链接器 > 输入 > 模块定义文件。
关于c++ - 如何查找dll注册失败的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42930606/