2013-05-11 216 views
0

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

我在两个propritory的解决方案来在这方面

ODBC-ODBC Bridge - Easysoft

Openlink Software

两者都是和解的解决方案,但在找一些开源或在内部推行

一个小小的研究在这方面,我相信如果我们可以将DLL作为一个单独的进程加载并使用IPC进行通信,如Interprocess Communication Between 32-bit and 64-bit Applications。这里面临的挑战是在数据涉及参考数据类型时对数据进行编组和解组。

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

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

回答

0

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

Delphi模型中的解决方案是启动另一个64位应用程序,它只是一个很细的DLL,本身并没有下载源代码来看它,但它从描述听起来像是一个IPC在64位进程中调用一个函数,并通过IPC将结果返回到32位进程。对于任何语言来说,这当然是合理的解决方案。然而,它涉及到一个额外的IPC阶段(当然这确实涉及编组问题 - 尽管数据库倾向于将结果作为文本提供,因此您可能在这方面相当出色),这在数据库中可能代价高昂应用程序由于数据的双重复制。

我完全不相信将应用程序编译为64位应用程序是不值得的 - 如果应用程序编写得很好,它不会比转换切换更多。由于提供了额外的寄存器,64位应用程序的运行速度往往比32位相同的应用程序快一点。

很抱歉,如果这不是您要查找的“这是一个链接...”的答案。

+0

我终于选择使用'COM RPC'在32位应用程序和64位进程之间进行通信。请注意,由于存在第三方DLL的依赖关系,因此无法将应用程序移植到64位。谢谢您的回答。 – Abhijit 2013-09-12 17:37:14