On Fri, 18 Aug 2000 07:44:50 +0900 Minero Aoki <aamine / dp.u-netsurf.ne.jp> wrote: > > rb_str_new2( "abcdefg\\#12345678\\" ) > > rb_str_new2( "abcdefg\\?12345678\\" ) > > > > 上の例のうち、1行目は問題ないのですが、2行目はうまくいかないのです。 > > ぼくの手元の環境だとなんの問題もないんですけど、どういうふうにうまく > いかないんですか? たぶん実際の例をちょっと加工してると思うんですが、 > その元のコードのミスの可能性の方がかなり高いです。 > > もし(C の)リテラル文字列として書いてるなら、トライグラフに > ひっかかってるとか。 > > ??= ??/ ??' ??( ??) ??! ??< ??> ??- どうやら、? は関係なかったようです。すみませんでした。 Ruby へモジュール・メソッドを定義する過程で、なにかミスを しているんだと思いますが、原因がちっともわかりません。 詳細を記しますので、よろしければご指導ください。 こんな感じで、Ruby にモジュールを追加しています。 // プロトタイプ VALUE rb_becky_GetCurrentMail( VALUE self ); // 現在のメールの識別子を得る VALUE rb_becky_GetCurrentMail( VALUE self ) { VALUE str; char *ptr; // bka.GetCurrentMail() はメールID文字列へのポインタを返す ptr = (char *)bka.GetCurrentMail(); str = rb_str_new2( ptr ); // Windows のメッセージボックスを表示 MessageBox( NULL , RSTRING(str)->ptr , NULL , MB_OK ); return( str ); } // Ruby にモジュールを追加する部分(抜粋) module = rb_define_module( "BECKY" ); rb_define_module_function( module , "currentmail" , (unsigned long(*)())rb_becky_GetCurrentMail , 0 ); 上の関数をコールしたあと、以下のテキストを rb_eval_string_protect() します。 a = BECKY.currentmail() f = open( "output.txt" , "w" ) f.print( a ) f.close() すると、「38d7fc16.mb\Ruby-Ext\?99AEE66」という内容のメッセージ ボックスが表示されます。 この文字列は、取得したい内容と完全に一致しています。 つまり、BECKY モジュールのメソッドは正しく呼び出され、目的の文字列 を Ruby の文字列に問題なく変換しています。 が、3行目で作成されるはずのファイルが作成されません。 どうやら、1行目の処理が正常に終了していないようです。 rb_eval_string_protect() の status には、TAG_RAISE が入っています。 が、どこをどう直せばいいのか、皆目見当がつきません。 どなたかご教示ください。よろしくお願いします。 -- redbug / netlife.gr.jp http://www.netlife.gr.jp/