こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

BCBでVC++のDLLを利用するために

C++Builder5で、VC++で作ったDLLを利用する必要に駆られてしまいました。
提供されているのはDLL本体とヘッダの2点で、BCBからリンクするために、implibを使ってdllからlibの作成をし、プロジェクトに加え、ヘッダをインクルードしました。続けて試しにコードを書いたところ、
'外部シンボル_initialize_libraryが未解決'
との表示。(initialize_libraryとはDLL内にある関数です。)

調べてみたところ、
1.呼び出し規約は標準で __stdcall
2.VC++ では、_ がシンボル名の頭に付く
3.Builder ではつかない
これで食い違いが生じているんだと思うのですが、更に調べると、モジュール定義ファイルにて再定義をすれば良いとの結論になりました。

BorlandのFAQも見たのですが、書式が理解できなくて・・・そこで質問させて頂きたいのですが、単純にproject名.defを作って、
>IMPORTS
>initialize_library=_initialize_library
とやってプロジェクトに加えれば良いのでしょうか?
ソース本体にextern "C" というのも必要なようですが、こちらの記述も教えて頂けたら嬉しいです。

投稿日時 - 2003-11-06 19:11:41

QNo.698891

暇なときに回答ください

質問者が選んだベストアンサー

>ありがとうございます。@8とかがまだ良くわかりませんが、マニュアルを見て試行錯誤してみます。

@8は、VisualC++が勝手につけている修飾です。
意味は確か、引数のバイト数から求められる数値のはずです。

>DLLからの関数名をdefで置き換えて、

ちょっと違います。
DLLから勝手にVC++に名前を変えられてエクスポートされた
関数名を本来の使いやすい名前に置き換えて、ということです。

>ちなみに、C++で書いています。また、C++によるDLLの利用サンプルがありますので、関数名は確認できます。

ここでいっているC++の利用サンプルはVC++用ですか?
これでは名前の修飾がVC++によって何事も無く理解されているので、呼び出せないということに対するサンプルにはならないのでは?

あくまでも必要とするのは、VC++によって勝手に変更された関数名です。


>で、あと一番肝心なことなのですが、DLLでエクスポートされている関数のVC++によって修飾された関数名は確認できてますか?

で、VC++によって変更された名前の確認方法はわかってますか?
という確認だったんですけど。

投稿日時 - 2003-11-07 10:44:14

補足

遅くなって申し訳ありません。メールが届いていなかったので気づきませんでした。
手元にあるのが、DLLに含まれているAPIの紙のマニュアルだけで、VC++で修飾された関数名というのの確認法はわからないです・・・。

投稿日時 - 2003-11-21 15:05:48

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

>はい、具体的には、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"はエラーになるのではずす必要があります。

投稿日時 - 2003-11-07 01:45:55

お礼

ありがとうございます。@8とかがまだ良くわかりませんが、マニュアルを見て試行錯誤してみます。
DLLからの関数名をdefで置き換えて、externで宣言をし直してから使えるということでしょうか(自信なし)。
ちなみに、C++で書いています。また、C++によるDLLの利用サンプルがありますので、関数名は確認できます。

投稿日時 - 2003-11-07 02:18:10

ANo.2

>'外部シンボル_initialize_libraryが未解決'
との表示。
>(initialize_libraryとはDLL内にある関数です。)

これがでているということは、VC++で作成したDLLは、
C++ではなくCで作成しているということでいいですか?

あと、VC++で作成されたDLLは修正、リコンパイル可能ですか?

可能でしたらQ&Aの1の方法、不可能でしたら2の方法を取ることになります。

投稿日時 - 2003-11-06 20:30:29

補足

すみません、あと、DLLのソースは提供されていないのでリコンパイル不可でお願いいたします。

投稿日時 - 2003-11-06 22:16:30

ANo.1

これも見ました?

http://www.borland.co.jp/qanda/cbuilder/c0005026.html

このサンプルのどこがわからないか言っていただければ
詳しく説明しますが。

投稿日時 - 2003-11-06 20:22:53

補足

はい、具体的には、Project1.defに示されている、Tes=Tes._Tes@8の意味と、extern内の処理の意味について知りたく思います。
物は試しで、externで以下のように真似っこをしてみたところ、
__declspec(dllimport) void __stdcall initialize_library()
extern内での再定義が間違っていると怒られてしまいました。また、DLLはC++だと思っていたのですが(サンプルが全てcppだったので)そういう記述がないのでCの可能性も十分あります。よろしくお願いいたします。

投稿日時 - 2003-11-06 21:55:00

あなたにオススメの質問