【问题标题】:How to access 32 bit dll from 64-bit process or 64-bit dll如何从 64 位进程或 64 位 dll 访问 32 位 dll
【发布时间】:2015-07-26 14:28:31
【问题描述】:

我有一个 java 程序,它利用 JNI 访问用 C++ 编写的“dll”文件。最初我在使用 JNI 访问“dll”时遇到问题,但是当我了解“DLL 导出”时,使用它并能够调用封装在“dll”中的函数。现在我只能通过通过 java 链接的 c++ 代码调用写在“64-bit dll”中的函数。如果我试图调用嵌入在 32 位 dll 中的函数,编译器会产生错误或根本不给出结果。经过一个小时的“错误和编译”播放后,我发现使用 64 位 jdk 及其 JNI 功能我无法调用用 c++ 编写的 32 位 dll。我必须使用 32 位 jdk 通过其 JNI 访问 32 位 dll。
现在我正在寻找一种解决方案,使用它我什至可以访问 32 位 dll(我的旧代码是用 32 位 dll 编写的,不能编译成 64 位 dll) 来自 64 位 jdk。或者简单地说,我正在寻找这样的代码,使用它我可以从 64 位进程或 dll 访问用 c++ 编写的 32 位 dll 代码。除此之外,我想提一下,我已经完成了“stackoverflow”提供的所有解决方案,以“从 64 位进程访问 -32 位 dll”,但我没有发现其中任何一个对我来说是足智多谋的。他们提到了“COM”和“Surrogate Process”, 但我无法连接如何使用这个东西来解决我遇到的问题。因此,任何人都可以建议我从 64 位 dll 访问 32 位 dll 的纯粹解决方案或指导或“参考书”。

注意:请不要对这个问题投反对票,因为我真的说到目前为止“堆栈溢出”中没有为这个问题提供适当的解决方案。

【问题讨论】:

    标签: c++ dll com corba dcom


    【解决方案1】:

    您可以使用代理,有很多信息可以说明如何设置代理以将组件加载到所需的架构中。

    问题是,如果您的接口不支持封送处理,或者组件具有线程或进程本地行为,它将无法正常工作。因此,只有准备好远程使用的组件才能工作。

    在尝试代理方法之前检查您的组件。

    【讨论】:

    • 感谢@Paulo 的宝贵意见。由于我对编组、代理等这一切都是新手,所以你所说的超出了我的想象。你介意给我推荐一些相关的书籍或参考资料吗?
    【解决方案2】:

    您根本无法做到您所要求的,并且有很多资源可以解释这一点。 64 位进程只能调用 64 位 DLL,32 位也是如此。你不能混搭。这就是 Windows(和 Linux)的工作方式。

    正确的解决方案是将 C++ 代码编译成 32 位和 64 位 DLL。

    【讨论】:

    • 我同意你的观点@Jonathon,但是如果我想调用 32 位中可用的遗留代码怎么办。许多网站(如 stackover flow)建议我 COM 可以作为此类情况的解决方案,前提是 32 位和 64 位作为单独的进程运行。您能对此发表看法吗?
    • 我认为将 COM 引入其中要比处理 32 位和 64 位的限制要痛苦得多。有什么理由不能坚持运行 32 位进程?许多应用程序这样做是为了处理遗留的 32 位代码。
    猜你喜欢
    • 2022-01-20
    • 2014-07-18
    • 2017-02-18
    • 2013-06-08
    • 2011-04-16
    • 1970-01-01
    • 2018-05-29
    • 2011-08-12
    • 2011-01-28
    相关资源
    最近更新 更多