c++ - 如何查找dll注册失败的原因

标签 c++ dll directshow

我正在使用来自这里的 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.

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

这是我做的:

  1. 从这里:https://github.com/cplussharp/graph-studio-next ,我为 BaseClasses

  2. 编译了 x86_MT 和 x64_MT 库
  3. 我创建了一个新项目,添加了现有的 Capture Source Filter 源文件,添加了上一点的包含和库的正确路径,将代码生成设置为 MT 并再次构建x86_MT 和 x64_MT。

  4. 我尝试使用 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/

相关文章:

C++ vector 插入新对象

c++ - 如何定位 "boost::noncopyable"错误?

c++ - 将 DirectShow 与 Direct2D 结合使用

c++ - 四舍五入的值(value)

c++ - 在 C++ 程序中查找 linux 中已安装的程序

c# - 无法加载文件或程序集 'Oracle.Web, Version=2.112.1.0... The system cannot find the file specified. (It' 已加载到我的 GAC 中)

c++ - 动态加载 Leadtools DLL

c# - .NET Core 应用程序加载 C++ DLL 失败

c++ - 如何在C++中使用DirectShow渲染音频

directshow - 是否有任何现代 Windows PC 中没有至少一个 DirectShow 捕获设备?