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/