著作一覧 |
エンコーディングの問題はrb_enc_find_index("encdb");
の呼び出しで解決。
rb_enc_find_indexは引数で指定されたエンコーディングが登録されていなければ、encの下から指定されたエンコーディングをロードする。
encdbは、encdb.c(encdb.h)で定義されたエンコード名とエイリアスを登録する拡張ライブラリなので、これによってCP932=Windows-31Jも登録される。したがって、Win32OLEはダミーのCP932を作らずに、encdbによって登録されたCP932=Windows-31Jを使うようになる。ということらしい。
したがって、ruby_optionsを呼ばずにRuby-1.9.1を組み込む場合、エンコーディングの初期登録として、rb_enc_find_index("encdb")
を呼び出す必要がある。
#define WIN32_LEAN_AND_MEAN #include#include "ruby.h" extern "C" { #include "ruby/encoding.h" } static char* test_src[] = { "begin\n", " require 'test/unit'\n", "rescue => e\n", " puts \"#{e}\"\n", "end\n", "puts RUBY_VERSION\n", "gets()\n", "\n"}; int main(int argc, char* argv[]) { #if defined(USE_ARGS) ruby_sysinit(argc, argv); #else static int dummyargc(0); static char** vec; ruby_sysinit(&dummyargc, &vec); #endif ruby_init(); // GC用にスタックポインタを設定、vmの起動 #if defined(USE_ARGS) ruby_options(argc, argv); #else // ruby_options(process_options)の処理を肩代わり ruby_script("Embeded Ruby"); // BT採取で死ぬので必須 ruby_init_loadpath(); // 常識的に必須(ruby/ver/arch,site_ruby,site_ruby/ver,site_ruby/ver/archなどが設定される) rb_enc_find_index("encdb"); #endif rb_require("win32ole"); // 拡張ライブラリのロード char szTemp[_MAX_PATH]; GetTempPathA(_MAX_PATH, szTemp); char szTempFile[_MAX_PATH]; GetTempFileNameA(szTemp, "rb1", 0, szTempFile); HANDLE h = CreateFile(szTempFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); for (int i = 0; i < sizeof(test_src)/sizeof(char*); i++) { DWORD dw; WriteFile(h, test_src[i], strlen(test_src[i]), &dw, NULL); } CloseHandle(h); int state = 0; for (i = 0; szTempFile[i]; i++) { if (szTempFile[i] == '\\') szTempFile[i] = '/'; } rb_load_protect(rb_str_new2(szTempFile), 0, &state); if (state) { printf("script error %d\n", state); } ruby_finalize(); return 0; }
「stack もきちんと説明してない……」は、「だといやだよね」というような憶測を喋ったので、実際にどうかは読んでいないのでわからないです。誤解を招く発言をしてごめんなさい。
ジェズイットを見習え |
面白かったです。勢いで2冊ほど買いましたw
どうもありがとうございます。