Linux/Unix システムで外部ライブラリの関数を動的に呼び出そうとしています。
ライブラリである程度成功しdl
ましたが、プリミティブ C 型が使用され、引数が値渡しされた場合のみです。
require 'dl/import'
module LibM
extend DL::Importer
dlload 'libm.so'
extern 'double sin(double)'
end
puts LibM.sin(3.14159265358979323846 / 2) # 1.0
しかし、C 構造体のようなより複雑な型を使用して、または引数が呼び出しの結果が格納されるポインターである場合、関数をどのようにインターフェースすることができますか?
module LibX11
extend DL::Importer
dlload 'libX11.so.6'
extern 'Display *XkbOpenDisplay (char *display_name, int *event_rtrn, int *error_rtrn, int *major_in_out, int *minor_in_out, int *reason_rtrn)'
end
Display
は大きな構造体であり、event_rtrn
いくつかの結果などが格納されています。
私はDL::CStructBuilderを見てきましたが、それは仕事をすることができるように見えますが、ドキュメントは非常に簡潔で、実際の例が見つからないため、適切に使用する方法がわかりません。
ターゲット マシンに追加の gem をインストールすることは禁止されているため、(可能であれば) 標準の Ruby 1.9 モジュールを使用する必要があります。