Ruby 关于加载 DelPhi7 写成的 dll 错误

sforce100 · 2014年04月22日 · 最后由 sforce100 回复于 2014年04月23日 · 3454 次阅读

如题,我想用 ruby 加载一个 DelPhi7 写成的 dll

1
require 'dl'
require 'dl/import'

module A
  extend DL::Importer
end
require 'fiddle'

lib = Fiddle.dlopen('btnetwork.dll')


2
require 'dl'
DL.dlopen('btnetwork.dll')

使用以上两种写法都一直报错

Documents/dll_test.rb:15:in `initialize': dlopen(/btnetwork.dll, 9): no suitable image found.  Did find: (DL::DLError)
  /btnetwork.dll: unknown file type, first eight bytes: 0x4D 0x5A 0x50 0x00 0x02 0x00 0x00 0x00

你的 OS 是 Win or Linux ? 32bit ? or 64 bit? Ruby 是 32 or 64 ?

btnetwork.dll 应该是个 Win32 的 PE file,如果你在 Win 系统下加载 btnetwork.dll , 当然不行了。 (暂不考虑 Wine 等乱七八糟的玩意)

#1 楼 @skandhas 我在 mac 和 win64 上都试过,都不行。请问这个 dll 要考虑到它编译时的系统环境吗,或者说,创建这个 dll 的时候和调用这个 dll 的时候要注意什么呢

Mac 下 肯定失败啊。前面说了,这是个 Win 下的一个 dll。其他 OS 你先别想了。

首先你要确定 (Win 下): 1 这个 dll 是 x86 还是 x86_64 的? 2 你的 Ruby 版本是 x86 还是 x86_64 的?

x86 的 Ruby 只能加载 x86 的 dll。 x86_64 的 Ruby 只能加载 x86_64 的 dll。

还有就是你这个 dll 是否有依赖到其他非系统的 import dll, 它们要么放在一起,要么能让系统的 Loader 能找的到也行。

可以用 delphixe6 编译成 mac 等不同的操作系统版本

xe6 可以跨平台编译

@skandhas @davidminaki 感谢两位,我试试 davidminaki 的方案

需要 登录 后方可回复, 如果你还没有账号请 注册新账号