当我尝试注册我的 C++/ATL 项目的 32 位版本时
regsvr32 project.dll
我收到此错误:
LoadLibrary("project.dll") failed - The specified module could not be found
project.dll 是我在 Visual Studio 10 上使用 ATL 构建的 dll。
64 位版本注册良好。
我错过了什么?
我观察到这个完全相同的错误,但解决方案没有安装可再发行组件。根据depends.exe,所有依赖的DLL都存在于系统1上。
就我而言,KERNEL32.DLL的图标略带红色。Depends.exe 没有提供太多解释,但四处挖掘发现系统上的 DLL 中缺少一个导入的函数。要查看导入的函数,请在树视图中选择依赖的 DLL ,然后在右侧面板中查找导入。按 PI 列排序以查看缺失导入的红色图标。
就我而言,缺少的功能是我悲伤的目标操作系统 Windows XP 上不存在的功能。由于我的程序不直接依赖于这个函数,我能够在我的项目中摆脱#define
以下内容:
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
使用这些宏进行编译使得有问题的函数没有在头文件中声明,因此不会在加载时导入。现在我可以使用regsvr32
. 这当然是一个非常具体(也很幸运)的案例。我不依赖该导入或任何其他较新的 API,因此我可以重新定位项目。如果它不是系统 DLL,我将需要找到一个较新的版本,这很容易导致需要更新依赖关系图的整个子树。或者更糟糕的是,如果我依赖于缺失的导入,则需要进行一些认真的重构。
总结起来,这个错误信息2可能是由以下问题引起的:
1.:除了 IESHIMS.DLL 和 WER.DLL 这显然是这个旧工具中的一个错误。
2.:或者真的,在特定系统上加载 DLL 的任何问题
在这种情况下,错误描述具有误导性。系统会找到您的 DLL (project.dll),但您的 DLL 的一个(或多个)依赖项可能会丢失。
我刚安装
Microsoft Visual C++ 2010 Redistributable Package
现在我可以安装dll了。
虽然这可行,但我对此不太满意,因为我不想必须在客户端上安装这个包才能让我的 dll 由他们工作。