首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何查找dll注册失败的原因

如何查找dll注册失败的原因
EN

Stack Overflow用户
提问于 2017-03-21 14:54:03
回答 2查看 428关注 0票数 1

我正在玩DirectShow过滤器,从这里:http://tmhare.mvps.org/downloads.htm。如果在Windows1064位计算机上使用包含的二进制文件,则示例Capture Source Filter可以正常工作。

相反,当我尝试注册过滤器时,重新编译源代码会导致以下错误:

模块“.”已加载,但未找到入口点DllRegisterServer。

据我所知,这可能是由于架构中的一些不匹配造成的。

我就是这样做的:

  1. 从这里:https://github.com/cplussharp/graph-studio-next,我为BaseClasses编译了x86_MT和x64_MT库。
  2. 我创建了一个新项目,添加了现有的Capture Source Filter源文件,添加了前面点的包含和库的正确路径,将代码生成设置为MT,并重新构建了x86_MT和x64_MT。
  3. 我试着用DirectShow Filter Manager (http://www.softella.com/dsfm/index.en.htm)注册输出过滤器--它在预编译器二进制文件中工作得很好。当然,在尝试使用新编译的过滤器之前,我已经注销了旧的过滤器。

Dependency Walker似乎没说什么有趣的话。它抱怨缺少了很多API-MS-WIN*.dll,但它们实际上是在文件系统上,而且无论如何,这些错误也适用于工作的二进制文件。

在这一点上,为了避免随机试验,应该做些什么来缩小错误的来源?有什么工具可以帮助我理解我错在哪里吗?

更新

我找到了问题的根源:原始代码使用一个def文件来导出函数,但实际上并没有导出它们。这是def文件:

代码语言:javascript
运行
复制
LIBRARY     Vcam.ax
EXPORTS
    DllMain                 PRIVATE
    DllGetClassObject       PRIVATE
    DllCanUnloadNow         PRIVATE
    DllRegisterServer       PRIVATE
    DllUnregisterServer     PRIVATE

但是,仅将该文件添加到源中是不够的。阅读这里的其他帖子让我明白,我需要使用__declspec(dllexport)而不是def文件。

因此,我用以下代码为dll.cpp添加了一个头文件:

代码语言:javascript
运行
复制
#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仍然告诉我,函数不是导出的。

EN

回答 2

Stack Overflow用户

发布于 2017-03-21 18:55:50

下面介绍了如何使用def文件:

https://msdn.microsoft.com/en-us/library/34c30xs1.aspx

缺少的步骤是将其添加到属性页>链接器>输入>模块定义文件中。

票数 1
EN

Stack Overflow用户

发布于 2017-03-21 21:54:00

模块“.”已加载,但未找到入口点DllRegisterServer。

有了这样的错误依赖,Walker应该能够确认DllRegisterServer是否可用--该实用程序显示导出的函数。

如果导出函数,问题可能是依赖关系或错误比特,这是导致无法LoadLibrary DLL的问题。

如果函数没有导出,项目很可能丢失一个.DEF文件,或者没有定义可导出的符号(例如使用#pragma)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42930606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档