- ベストアンサー
BCBでVC++のDLLを利用するための問題
- BCBでVC++のDLLを利用するための問題について調査しました。
- VC++で作ったDLLをBCBでリンクするためには、implibを使ってlibファイルを作成し、ヘッダをインクルードする必要があります。
- 呼び出し規約の違いやシンボル名の違いが原因で、エラーが発生する可能性があります。モジュール定義ファイルを作成して再定義することで解決できる場合があります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>ありがとうございます。@8とかがまだ良くわかりませんが、マニュアルを見て試行錯誤してみます。 @8は、VisualC++が勝手につけている修飾です。 意味は確か、引数のバイト数から求められる数値のはずです。 >DLLからの関数名をdefで置き換えて、 ちょっと違います。 DLLから勝手にVC++に名前を変えられてエクスポートされた 関数名を本来の使いやすい名前に置き換えて、ということです。 >ちなみに、C++で書いています。また、C++によるDLLの利用サンプルがありますので、関数名は確認できます。 ここでいっているC++の利用サンプルはVC++用ですか? これでは名前の修飾がVC++によって何事も無く理解されているので、呼び出せないということに対するサンプルにはならないのでは? あくまでも必要とするのは、VC++によって勝手に変更された関数名です。 >で、あと一番肝心なことなのですが、DLLでエクスポートされている関数のVC++によって修飾された関数名は確認できてますか? で、VC++によって変更された名前の確認方法はわかってますか? という確認だったんですけど。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>はい、具体的には、Project1.defに示されている、>Tes=Tes._Tes@8の意味と、extern内の処理の意味について知りたく思います。 置き換える関数名=DLL名.エクスポートされた名前 です。 >extern "C"{ >void __stdcall Tes( char *strA, char *strB ); >} は、処理ではありません。宣言です。通常は、ヘッダーファイルにかかれている関数のプロトタイプ宣言です。 で、あと一番肝心なことなのですが、DLLでエクスポートされている関数のVC++によって修飾された関数名は確認できてますか? あと、C++Builder5でかかれているソースはC++ですか? Cですか?もしCでしたらextern "C"はエラーになるのではずす必要があります。
お礼
ありがとうございます。@8とかがまだ良くわかりませんが、マニュアルを見て試行錯誤してみます。 DLLからの関数名をdefで置き換えて、externで宣言をし直してから使えるということでしょうか(自信なし)。 ちなみに、C++で書いています。また、C++によるDLLの利用サンプルがありますので、関数名は確認できます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>'外部シンボル_initialize_libraryが未解決' との表示。 >(initialize_libraryとはDLL内にある関数です。) これがでているということは、VC++で作成したDLLは、 C++ではなくCで作成しているということでいいですか? あと、VC++で作成されたDLLは修正、リコンパイル可能ですか? 可能でしたらQ&Aの1の方法、不可能でしたら2の方法を取ることになります。
補足
すみません、あと、DLLのソースは提供されていないのでリコンパイル不可でお願いいたします。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
これも見ました? http://www.borland.co.jp/qanda/cbuilder/c0005026.html このサンプルのどこがわからないか言っていただければ 詳しく説明しますが。
補足
はい、具体的には、Project1.defに示されている、Tes=Tes._Tes@8の意味と、extern内の処理の意味について知りたく思います。 物は試しで、externで以下のように真似っこをしてみたところ、 __declspec(dllimport) void __stdcall initialize_library() extern内での再定義が間違っていると怒られてしまいました。また、DLLはC++だと思っていたのですが(サンプルが全てcppだったので)そういう記述がないのでCの可能性も十分あります。よろしくお願いいたします。
補足
遅くなって申し訳ありません。メールが届いていなかったので気づきませんでした。 手元にあるのが、DLLに含まれているAPIの紙のマニュアルだけで、VC++で修飾された関数名というのの確認法はわからないです・・・。