From: "伊藤 友裕" Date: 2000-02-19T23:02:39+09:00 Subject: [ruby-list:20861] RE:Windows の呼び出し形式について。  ごめんなさい!  以前にだした質問は、内容があべこべでした。  改めて質問させてください。  ruby 1.4.3のソースを、VisualC++6.0でコンパイルしたmswin版を使っています。  今、拡張ライブラリを作ろうとしています。  そこで、別のライブラリ EL.LIB(ライブラリのファイル名ではなく、こういう名 前のライブラリです m(_ _)m )を使いつつ拡張ライブラリを組もうとしました。  が、EL.LIB側とRuby側との関数の呼び出し形式がかちあってしまい、うまくコンパ イルできません。 ============================================================== #include "EL_ruby.h" // EL.LIBを使う。 #include "ruby.h" // rubyライブラリィを使用する場合は、必ず必要です。 ==============================================================  このように呼んでいるのですが、VC++6.0 でコンパイルしてみると下のようになっ てしまいました。  EL.LIB はヘッダファイル EL.H (手を加えたので「EL_ruby.h」というファイル名 になっています。)にすべて記述されているライブラリです。  オプションに -Gz を付けて( _stdcall 形式を指定して)コンパイルすると、 ============================================================== ライブラリ DirectX.lib とオブジェクト DirectX.exp を作成中 DirectX.obj : error LNK2001: 外部シンボル "_rb_str_new2@4" は未解決です DirectX.obj : error LNK2001: 外部シンボル "_rb_int2inum@4" は未解決です DirectX.dll : fatal error LNK1120: 外部参照 2 が未解決です。 NMAKE : fatal error U1077: 'cl' : リターン コード '0x2' Stop. ============================================================== といったエラーが、私の書いたプログラムで使っているRubyのマクロなどに応じて発 生し、DLLファイルが作れません。  普通に( _cdecl 形式を指定したことになる)コンパイルすると、 ============================================================== EL_C.h(5668) : error C2664: 'DirectDrawEnumerateA' : 1 番目の引数を 'int (__cdecl *)(struct _GUID *,char *,char *,void *)' から 'int (__stdcall *)(struct _GUID*,char *,char *,void *)' に変換できません。 (新しい機能 ; ヘル プを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要 です。 NMAKE : fatal error U1077: 'cl' : リターン コード '0x2' Stop. ============================================================== このようなエラーがでてコンパイルできません。  EL.LIB ライブラリのヘルプでは -------------------------------------------------------------- エラー発生 ケース1 error C2664: 'DirectDrawEnumerateA' : 1 番目の引数を 'int (__cdecl *)(struct _GUID *,char *,char *,void *)' から 'int (__stdcall *)(struct _GUID *,char *,char *,void *)' に変換できません。 原因  これは、プログラムコード生成時の、呼出し規約の違いが原因です。標準では cdeclですが、elを使用して開発した場合、stdcallにする必要があります。 ---------------------------------------------------------------  と記されていました。  これに従うとRuby側の外部参照が解決しないので、質問させていただきました。  試しに問題のライブラリ、 EL.H のエラーとなっている部分だけを、 static BOOL SearchDriver(GUID FAR*,LPSTR,LPSTR,LPVOID);      ↓    ↓    ↓ static BOOL _stdcall SearchDriver(GUID FAR*,LPSTR,LPSTR,LPVOID);  のように書き換えてみましたが、作成されたDLLファイルを使ってみたらハング アップしてしまいました。  間違った質問でご迷惑をおかけしましたが、改めて宜しくお願いします。 ################################################################# # mailto:j6398015@ed.noda.sut.ac.jp # mailto:tyabo@aaw.mtci.ne.jp # mailto:yack@aaw.mtci.ne.jp # ICQ:19206282 # 伊藤 友裕 # http://www.ed.noda.sut.ac.jp/~j6398015/ #################################################################