0

我想从 32 位应用程序访问 64 位 dll。由于第三方锁定,我们没有合适的 32 位应用程序端口。创建 2 个不同版本的 64 位 dll 实际上是不可行的,因为要满足依赖关系,我们最终可能不得不以两种位数构建几乎整个应用程序,这将使整个移植目的无效。为了进一步放大,我们想从 32 位应用程序访问 64 位 ODBC。

在这方面我遇到了两个专有的解决方案

ODBC-ODBC 桥 - Easysoft

开联软件

两者都是解决方案,但正在寻找一些开源或内部实现

在这方面的一些研究让我相信,如果我们可以将 dll 作为一个单独的进程加载并使用 IPC 进行通信,如32 位和 64 位应用程序之间的进程间通信中所述,这是可能的。这里的挑战是通常在涉及引用数据类型时对数据进行编组和解组。

在这方面,我遇到了一个 SO answer Is it possible to access a 64-bit dll from a 32-bit application? 它链接到Code Central 中的解决方案。这是一个 delphi 解决方案,也是我想为 Visual C++ 细读的类似解决方案。

是否有任何开源实现试图解决这个问题?

4

1 回答 1

0

您不能从 32 位应用程序访问 64 位 DLL - 或从 64 位应用程序访问 32 位 DLL。那是因为处理器无法像那样切换模式 - 当 64 位操作系统运行 32 位应用程序时,处理器处于“兼容模式”,您必须更改模式才能进入动态链接库。尽管在技术上可以实现模式切换,但还有许多其他问题 - 例如“当 32 位应用程序在单个寄存器中接收 64 位值时会发生什么。”。

Delphi 模型中的解决方案是启动另一个 64 位的应用程序,并且只是对 DLL 本身的一个薄垫片 - 我还没有下载源代码来查看它,但它确实从描述听起来像IPC 在 64 位进程中调用函数并通过 IPC 将结果返回给 32 位进程。对于任何语言,这无疑是一个合理的解决方案。然而,它确实涉及一个额外的 IPC 阶段(这当然涉及一个编组问题 - 尽管数据库倾向于以文本形式提供结果,所以在这方面你可能会很好地摆脱它),这在数据库中可能是昂贵的由于数据的双重复制而导致的应用程序。

我完全不相信将您的应用程序编译为 64 位应用程序是不值得的——如果应用程序编写得很好,那只不过是切换开关而已。由于可用的额外寄存器,64 位应用程序的运行速度往往比 32 位相同的应用程序快一点。

抱歉,如果这不是您正在寻找的“这是一个链接......”答案。

于 2013-05-11T09:30:53.487 回答