【问题标题】:Win32OLE used in 64 bit ruby cannot load 32 bit C++ Dll64 位 ruby​​ 中使用的 Win32OLE 无法加载 32 位 C++ Dll
【发布时间】:2018-06-14 17:45:57
【问题描述】:

我正在尝试将 C++ DLL 作为二进制对象加载到我的 Ruby 应用程序中。 我已经使用regsrv32 注册了接口并使用Win32OLE 加载了Dll .. 但是如果我正在运行Ruby 的64 位变体,我无法加载32 位C++ dll,反之亦然。唯一有效的组合是

32 位 ruby​​ 加载一个 32 位 C++ Dll。 64 位 ruby​​ 加载 64 位 C++ Dll

我在这里看到的唯一可能的方法是分叉出一个 32 位 ruby​​ 进程来通过 Win32OLE 注册和加载 32 位 dll。

【问题讨论】:

  • 您需要同时注册 32 位和 64 位 dll
  • 你是在暗示,x86_64 是某种薛定谔位吗?还是您只是假设,这意味着您的想法?这很可能不是它的真正含义。
  • 忽略 x86_64 评论,这纯粹是我的思考过程。这些文章很有用,但在这里我试图从另一种语言 - Ruby 访问二进制对象。所以 CoCreateInstance() 不会有帮助。
  • 如果您希望我们忽略该评论,请将其从您的问题中删除。至于CoCreateInstance:COM 对象通常是这样实例化的。无论您是从 C、Delphi、Go 还是 Ruby 执行此操作都没有区别。在回避 COM 时不能使用 COM。这些是规则。你将不得不与他们达成协议。

标签: c++ ruby winapi dll


【解决方案1】:

老问题,但目前还没有答案,所以我试试:)。

由于 ruby​​ 使用 64 位,而您的 COM+ 可能是 32 位,它不会在库模式下运行。

为了解决这个问题,您注册您的 COM+ 组件,然后将您的 dll 设置到 dcomcnfg.exe 中的服务器应用程序。

这将以 32 位 dllhost.exe 运行您的 dll,然后 ruby​​ 可以通过 dll = WIN32OLE.new("your.dll") 成功调用您的 DLL

注意:您可能需要设置一个额外的身份。

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 2015-01-07
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多