dポイントプレゼントキャンペーン実施中!

皆さん こんにちは。

VCで作成したCのAPIを実装したDLLをBCB6.0で作成したアプリケーションから呼び出そうとしています。
コンパイルは通るのですが、リンク時に以下のエラーメッセージが表示されてしまいます。

  [リンカ エラー] 外部シンボル 'My Function' が未解決(C:\BCB\***.OBJ が参照)

BCB6のフォームプロジェクトからDLLを利用するために、以下の手順を行いました。
(1)DLLをbcb用に変換する
  implib -a aaa.lib aaa.dll
(2)プロジェクトにaaa.libを追加
(3)aaa.dllをプロジェクトのフォルダに追加
(4)コードを以下のように実装しました
   extern "C" __stdcall ulong SysInitialize(void);  //プロトタイプ宣言
   ulong ulRetVal = SysInitialize(); //コード内での呼び出し

この状態でコンパイルは通るのですがリンカでエラーが発生します
  
  [リンカ エラー] 外部シンボル 'SysInitialize' が未解決(C:\BCB\TELIGEV\MAINDLG.OBJ が参照

他のサイトで調べたところ、C++特有の修飾子"@***"がついている場合に同じエラーが出るとのことだったので、dumpbin.exeを使ってDLL内の関数をダンプしたところ、関数名にはアンダースコアや@などは関数名についていないようです。
dumpbinの出力結果
  1 1D 000065A0 SysInitialize

このほか、自分なりに調べたところ、以下のサイトを見つけたのですが、英語力の弱さから解決策を見出すまでには至りませんでした。
Using Visual C++ DLLs with C++Builder http://bcbjournal.org/articles/vol4/0012/Using_V …


どなたか、ご助言いただけると助かります。
よろしくお願いします。

A 回答 (1件)

> VCで作成したCのAPIを実装した


と書かれていますが、これは本当にC としてビルドされていますか?
ただ普通にプロジェクトを作っただけでは VC++ は C++ としてプロジェクトをビルドします。

VC++ 2010 Express ではプロジェクトまたはソースのプロパティの「構成プロパティ」-「C/C++」-「詳細設定」の中に「コンパイル言語の選択」がありますので、「C コードとしてコンパイル」を設定してください。
    • good
    • 0
この回答へのお礼

早速回答していただきまして、ありがとうございます。
このDLLが本当にCのAPIを実装しているのか、実は裏付けが取れていませんでした。^_^;
dumpbin.exeの関数名にC++特有の@**がついていないことと、_がついていないのでCだろうなと思っていました。
ただ、implibで変換したlibファイルをバイナリエディタで確認したら、"_SysInitialize"となっていました。
dllは、"SysInitialize"になっていたので、これが原因かもしれません。
明日、dllの開発者に、「C コードとしてコンパイル」を設定したか確認してみます。
ありがとうございました。

お礼日時:2014/05/29 20:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!