Ruby バージョン 2.1.2 を wxWidgets アプリケーションに埋め込み、Windows でコンパイルおよびターゲット設定しています。msvcrt-ruby210.dll へのリンクと呼び出し
ruby_sysinit(&argc, &argv);
RUBY_INIT_STACK;
ruby_init();
ruby_init_loadpath();
基本的な VM と組み込みクラスを実行するには、これで十分です。ただし、アプリケーションから FileUtils や Resolv などの機能を使用するつもりなので、標準ライブラリもアプリケーションにパッケージ化しています。require
一部のライブラリは問題なく使用できrequire 'resolv'
ますが、エラー報告が表示されるとunitialized constant Encoding::UTF_16LE
. ruby.c でいくつかのグーグルと掘り下げた後、次の初期化コードでこれを修正できることがわかりました...
ruby_sysinit(&argc, &argv);
RUBY_INIT_STACK;
ruby_init();
ruby_init_loadpath();
rb_enc_find_index("encdb");
これにより、以前のエラーはクリアされますが、code converter not found (UTF-8 to UTF-16LE)
. これは追加の行を追加することで修正されますが、Rubyの関数rb_eval_string("require 'enc/trans/transdb'");
によって実行される初期化コードを少しずつ複製するのは私の好みではないのでruby_options
、Ruby自身の関数のように直接使用しようとしましたmain
...
int my_argc = 2;
char* arg1 = "myapp.exe";
char* arg2 = "scripts/bootstrap.rb";
char** my_argv = new char*[2]{arg1, arg2};
ruby_sysinit(&my_argc, &my_argv);
RUBY_INIT_STACK;
ruby_init();
ruby_run_node(ruby_options(my_argc, my_argv));
ただし、これは、アプリケーションを で実行した場合にのみ有効ですmyapp.exe scripts/bootstrap.rb
。ruby は私のパラメーターを無視してruby_options
、システムが提供する argc と argv の値を使用しているようです (明らかに、これは Windows でしばらくの間当てはまりました)。実行可能ファイルをダブルクリックするだけでアプリケーションを実行し、ユーザーが「ブートストラップ」スクリプトの場所を示すコマンドライン引数を指定する必要がないようにしたいので、これは面倒です。
この場合、コマンドラインパラメータを必要とせずにルビーを初期化するために使用できる便利なAPIまたは呪文はありますか?
可能であれば、アプリケーションを ruby 拡張機能としてパッケージ化する必要は避けたいと考えています。