2021/08/14(土) [n年前の日記]
#1 [ruby][dxruby] Rubyのfiddleを勉強中
bassrb (Bass.rb) を fiddle を使って動くように修正しようとしているけれど、そもそも Ruby の fiddle の使い方だの、C言語のデータ型がよく分からないので、そのあたりを勉強しつつ作業中。
Ruby の fiddle は、.dll, .so 等のダイナミックリンクライブラリを扱うためのライブラリ、だそうで。
_library fiddle (Ruby 3.0.0 リファレンスマニュアル)
とりあえず分かってきたことをメモ。
boolとBOOLは違う。bool はC言語(?)のデータ型、boolean型で、BOOL は Visual C++ で使うデータ型だそうで。実際には BOOL は int で、false が 0、true が 1 になっているっぽい。bass.h の中で、戻り値が BOOL の関数? メソッド? がたくさんあるけれど、その場合戻り値は int として扱っていいらしいなと…。
DWORD は int か uint32_t で置き換えることができる。
QWORD というデータ型が bass.h に出てきたけど、uint64_t で置き換えればいいらしい。
fiddle/types を使えば、BOOL や DWORD をそのまま記述できるようになるっぽい。ただ、dlload をした後で include Fiddle::Win32Types を記述しないとダメらしい。
fiddle の dlload "bass.dll" で .dll をロードできるはずが、Ruby のバージョンによっては「そんなファイルは見当たらない」とエラーになってしまう。Ruby のバージョンによっては、.dll を探す場所が違うという話を見かけた。とりあえず、以下のような書き方をして、「スクリプトファイルのある場所に .dll もあるはず」という前提で絶対パスを渡して誤魔化してみたけど、これで合ってるのかどうか…。
bass.h の中で float が出現するけれど、C言語の float と Ruby の float は違うようで…。
Bass.rb の中に出現する「::」が分からない…。何だコレ…。ググってみたら「トップレベル」云々という言葉が出てきたけど…。よく分からないけど、module Bass の中のメソッドを呼びたい時は、::Bass.hoge() と書けば呼べる、ということでいいのだろうか。
Ruby の fiddle は、.dll, .so 等のダイナミックリンクライブラリを扱うためのライブラリ、だそうで。
_library fiddle (Ruby 3.0.0 リファレンスマニュアル)
とりあえず分かってきたことをメモ。
boolとBOOLは違う。bool はC言語(?)のデータ型、boolean型で、BOOL は Visual C++ で使うデータ型だそうで。実際には BOOL は int で、false が 0、true が 1 になっているっぽい。bass.h の中で、戻り値が BOOL の関数? メソッド? がたくさんあるけれど、その場合戻り値は int として扱っていいらしいなと…。
DWORD は int か uint32_t で置き換えることができる。
QWORD というデータ型が bass.h に出てきたけど、uint64_t で置き換えればいいらしい。
fiddle/types を使えば、BOOL や DWORD をそのまま記述できるようになるっぽい。ただ、dlload をした後で include Fiddle::Win32Types を記述しないとダメらしい。
module M extend Fiddle::Importer dlload "bass.dll" include Fiddle::Win32Types ...
fiddle の dlload "bass.dll" で .dll をロードできるはずが、Ruby のバージョンによっては「そんなファイルは見当たらない」とエラーになってしまう。Ruby のバージョンによっては、.dll を探す場所が違うという話を見かけた。とりあえず、以下のような書き方をして、「スクリプトファイルのある場所に .dll もあるはず」という前提で絶対パスを渡して誤魔化してみたけど、これで合ってるのかどうか…。
module Bass bassdllpath = format("%s/%s", File.expand_path("..", __FILE__), "bass.dll") extend Fiddle::Importer dlload bassdllpath ...
bass.h の中で float が出現するけれど、C言語の float と Ruby の float は違うようで…。
- Ruby の float は C言語の double相当。(8byte)
- C言語の float は 4byte。
BASS_ChannelSetAttribute = Win32API.new("bass", "BASS_ChannelSetAttribute", "III", "I") ... ::Bass.err if BASS_ChannelSetAttribute.call(@ch, 2, [v].pack("f").unpack("I")[0]) == -1fiddle の場合はどう記述するのが妥当なのだろう…。とりあえず、以下のような書き方をしてみたけど…。
extern "int BASS_ChannelSetAttribute(int, int, float)" .... ::Bass.err if ::Bass.BASS_ChannelSetAttribute(@ch, 2, [v].pack("f").unpack("f")[0]) == 0
Bass.rb の中に出現する「::」が分からない…。何だコレ…。ググってみたら「トップレベル」云々という言葉が出てきたけど…。よく分からないけど、module Bass の中のメソッドを呼びたい時は、::Bass.hoge() と書けば呼べる、ということでいいのだろうか。
◎ 参考ページ。 :
以下のページが参考になりました。ありがたや。
_データ型
_データ型 - Windows API 入門
_データ型
_VC++のBOOLとbool型の違い - 小さい頃はエラ呼吸
_C言語の型とWinAPIで使う型のマッピングとRubyのDL/Import - それマグで!
_module Fiddle::Win32Types (Ruby 3.0.0 リファレンスマニュアル)
_fiddle/types.rb at master ・ ruby/fiddle
_library fiddle/types (Ruby 3.0.0 リファレンスマニュアル)
_chef - ruby でクラス名の先頭に :: がつくときの意味について - スタック・オーバーフロー
_Ruby - Rubyの「::」が指すトップレベルについて|teratail
_Ruby: クラス名の先頭につける :: (先頭二重コロン) は何?
_データ型
_データ型 - Windows API 入門
_データ型
_VC++のBOOLとbool型の違い - 小さい頃はエラ呼吸
_C言語の型とWinAPIで使う型のマッピングとRubyのDL/Import - それマグで!
_module Fiddle::Win32Types (Ruby 3.0.0 リファレンスマニュアル)
_fiddle/types.rb at master ・ ruby/fiddle
_library fiddle/types (Ruby 3.0.0 リファレンスマニュアル)
_chef - ruby でクラス名の先頭に :: がつくときの意味について - スタック・オーバーフロー
_Ruby - Rubyの「::」が指すトップレベルについて|teratail
_Ruby: クラス名の先頭につける :: (先頭二重コロン) は何?
[ ツッコむ ]
以上です。