注册和使用 64 位 C++ 编写的 ATL 动态库时遇到问题

Having problems registering and using a 64-bit C++ written ATL dynamic library

我在 Windows 7 x64 下注册和使用动态库时遇到问题,64 位版本的 dll 编译但编译器日志输出:

Error MSB3073: The command "RegSvr32 /S "...\x64\Debug\xxxxx.dll" exited with code 3.

但是,当我构建 32 位版本的 dll 时,编译器日志输出 RegSvr32 命令成功。

我已经在 x86 和 x64 构建配置中将 Linker >> General >> Register Output 设置为 No

我用 64 位 dll 尝试 运行 64 位和 32 位版本的 RegSvr32(无静默模式),但它响应以下错误:

The module "xxxxx.dll" failed to load. Make sure the binary is stored at the specified path or debug it to check for problems with the binary or dependent .DLL files. The specified module could not be found.

我使用 dependency walker 检查了它,它报告缺少 100 多个 dll,所以我不能在这里显示它们。其中一些是:

API-MS-WIN-CORE-COM-L1-1-1.DLL
API-MS-WIN-CORE-DATETIME-L1-1-1.DLL
API-MS-WIN-CORE-DEBUG-L1-1-1.DLL
API-MS-WIN-CORE-ERRORHANDLING-L1-1-1.DLL
API-MS-WIN-CORE-FILE-L1-2-1.DLL
...
WLANUTIL.DLL
WLDAP32.DLL
WTSAPI32.DLL
XMLLITE.DLL

已打开 dll 的 Dependency Walker:

我想知道只有64位版本的dll无法使用RegSvr32注册是什么原因

非常感谢解决此问题的任何帮助。

更新 1

尝试 运行 使用此动态库的应用程序会导致以下错误(32 位和 64 位版本):

The program can't start because api-ms-win-core-errorhandling-l1-1-1.dll is missing from your computer. Try reinstalling the program to fix this problem.

我目前安装的所有可再发行软件包:

是否有任何我必须安装的 visual c++ 可再发行组件来解决这个问题?

更新 2

我在 api-ms-win-core-errorhandling-l1-1-1.dll here 上找到了更多信息并尝试将 WindowsApp.lib 链接到这个动态库,但它甚至没有解决问题。

更新 3

我 运行 系统文件检查器,它给了我以下输出,正如我认为的那样:

Windows Resource Protection did not find any integrity violations.

  1. 进入您要注册的 DLL 的项目属性
  2. 转到配置属性 >> 调试
  3. 在 "Command" 下,单击向下的小箭头并选择 "regsvr32.exe"
  4. 在 "Command Arguments" 下键入“$(TargetName)”
  5. 在您的 DLLMain 中的某处放置一个断点
  6. 现在调试 DLL(在解决方案资源管理器中右键单击 dll 项目并选择 "Debug")

如果您到达主 DLL,您可以从那里进行调试,直到它失败。如果不这样做,您应该查看输出 window 以查看任何相关消息。您可能还需要更改输出 window 过滤器。右键单击输出 window 并检查所有类别的消息以确保它为您提供所有内容,然后再次调试。

这至少应该告诉您失败的地方。查找模块加载失败等

编辑添加 - 您可以尝试通过删除“/S”来更改构建步骤。那是 "Silent" 模式,在这种情况下,您希望看到消息。

我最终通过从项目的 x86 和 x64 版本的链接 .lib 文件中删除 mincore.lib 解决了这个问题,我最近链接使用 GetFileVersionInfoSize API功能。