トップ «前の日記(2009-02-05) 最新 次の日記(2009-02-07)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2009-02-06

_ 池袋ジュンク堂トークセッション

無事、完了しました。皆様、どうもありがとうございました。

お楽しみいただけたら幸いです。

_ 組み込みRubyテンプレート

エンコーディングの問題は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件) [ツッコミを入れる]
_ shachi (2009-02-06 03:44)

面白かったです。勢いで2冊ほど買いましたw

_ arton (2009-02-06 09:04)

どうもありがとうございます。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え