从32位进程访问64位ODBC

时间:2013-05-11 07:56:32

标签: c++ visual-c++ odbc porting

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

我在这方面遇到了两个提案解决方案

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 ++。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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