我有一个关于为 32 位 DLL 正确编写 COM/ATL 包装器的问题。
这就是问题所在。正如我的其他一些问题所暗示的那样,我经常需要在大型代码库上执行编码工作,其中包括从无数不同供应商链接的库。我们的软件可以在各种机器、各种架构上运行。此代码主要用 C# 编写,并且 C++ DLL 被链接或编译/链接,然后在必要时从 C# 中 P/Invoked(在我看来,比托管 C++ 更容易实现)。
无论如何,一个这样的程序包含必须与几个 64 位 DLL 接口的 C# 代码,而这些 DLL 的源代码不可用。该软件的目标主机都是 64 位的。没问题。因此,在 AnyCPU 模式下运行的 C# 会自动生成为 64 位(没有 WoW),并且能够无缝地 P/Invoke 这些预编译的第 3 方 64 位 DLL。
有一个这样的 DLL,只有 32 位版本可供我使用。无法获得此 DLL 的 64 位版本。我有 1.) 32 位 DLL,2.) 包含函数导出的头文件(即 #define EXP __declspec(dllexport)、EXP BOOL WINAPI DLL_Function(IN int myInt,OUT int *result); 和 3.)对应的 32 位 lib 文件。
经过广泛的研究,我了解到,COM/ATL 显然是从 64 位进程访问 32 位 DLL 的正确方法。显然,我在 WoW 下生成了一个 32 位 COM 进程,并与之交互。从架构的角度来看听起来不错,但我找不到任何关于如何具体做到这一点的教程或描述。我尝试过使用 Visual Studio 2010 的 ATL 向导,但仍然不知道如何正确执行此操作。有没有自动化工具?有模板或教程吗?我保证我已经尽我所能搜索了网络,只是想知道 1.)我是否以正确的方式解决这个问题,或者 2.)你知道任何资源吗?或者 3.)确实有人为此提供某种通用 IPC 模板吗?
从我在 SO 上读到的内容来看,像这样的图像不匹配似乎是程序员的一个常见问题,但除了“使用 COM /ATL”。我之前的一篇文章产生了一个回复,其中 P/Invoke 签名调用的问题被详细地充实了,这太棒了——我想知道我们是否可以开始一个“确定的”64/32 位跨架构讨论到这里!
谢谢!
-卡达伊
编辑:我已经知道http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/,并且了解架构,但我想知道实施细则。