【问题标题】:Access 64 bit ODBC from 32 bit Process从 32 位进程访问 64 位 ODBC
【发布时间】:2013-05-11 17:30:53
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我终于选择使用COM RPC 在 32 位应用程序和 64 位进程之间进行通信。请注意,由于与第三方 DLL 存在依赖关系,因此无法将应用程序移植到 64 位。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2014-07-18
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2011-04-01
    • 2011-01-23
    相关资源
    最近更新 更多