• 締切済み

VCで作成したDLLをBCBから呼び出す方法

皆さん こんにちは。 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_Visual_C_DLLs_with_CBuilder.htm どなたか、ご助言いただけると助かります。 よろしくお願いします。

noname#221964
noname#221964

みんなの回答

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

> VCで作成したCのAPIを実装した と書かれていますが、これは本当にC としてビルドされていますか? ただ普通にプロジェクトを作っただけでは VC++ は C++ としてプロジェクトをビルドします。 VC++ 2010 Express ではプロジェクトまたはソースのプロパティの「構成プロパティ」-「C/C++」-「詳細設定」の中に「コンパイル言語の選択」がありますので、「C コードとしてコンパイル」を設定してください。

noname#221964
質問者

お礼

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

関連するQ&A

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • 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" というのも必要なようですが、こちらの記述も教えて頂けたら嬉しいです。

  • Visual studio c++ dll作成時のエラー

    c初心者です。 ユーザーからもらったaaa.dllにある関数Calc_UL(struct型)をコールするbbb.dllを作成しようしています。 コンパイルはとおるのですが、 dllのビルドがうまくいきません。ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、aaa.libにはリンク設定をしています。 bbb.obj : error LNK2001: 外部シンボル ""int __stdcall Calc_UL(struct ULData *)" (?Calc_UL@@YGHPAUULData@@@Z)" は未解決です Debug/bbb.dll : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? よろしくお願いします。

  • VC++でDLLを作っていますがぁ~???

    1ソリューション1プロジェクト主義です ⇒ 実はゴチャゴチャになってしまうのが怖いだけです ですからDLLを作る際にもDLL自体とDLL呼出し元を別のソリューションで作り、呼出し元のリンカーの入力の『追加の依存ファイル』でDLL.libを指定しています そうするとリビルドで『DLL.dllが無いぞ!』とのエラーが出ます 仕方がないのでDLLソリューションから呼出し元EXEのディレクトリィにDLL.dllをコピーするとOKになります 質問 DLLソリューションからDLL.dllをコピーしなくとも良い方法はありますか? 出来ましたら以下の愚問にもお答え頂ければ幸いです 愚問(1) DLL.dllとは何者ですか? 私にはDLL.libが必要なのですがぁ~ 愚問(2) DLLを作成する事例の各種のサンプルでは同じソリューションにDLLと呼出し元を入れて、出来上がったDLL.libのパスを呼出し元プログラムのプロジェクトの追加の依存ファイルに書込んでいます サンプルのように同じソリューションに入れるメリットは何ですか? 愚問(3) DLLの文字セットには『設定なし』を指定しています。呼出し元の文字セットはマルチバイトです。なぜ整合性が取れるのでしょうか? 宜しくお願い申し上げます

  • VC.NET(C#)のクラスライブラリをBCB(C++)で使用したい

    タイトルにあるように、 VC.NET(C#)のクラスライブラリを作成したのですが、 BCB(C++)での使用方法がわかりません。 BCBでプロジェクトに追加で、Dllを追加するのだろうと言うのは わかったのですが、 ソース上で、Dllをどのように呼び出したらよいのかわかりません。 Dllをプロジェクトに追加する以前に、何かしなくてはならないことがあるのでしょうか? よろしくお願いいたします。

  • VC2005のDLLを6.0で呼び出すには

    VC 2005 Pro Editionで作ったライブラリ(ヘッダ、lib、dll)を頂きました。    頂いたDLLの形式は定義ファイル.defを使わない形式、declspec(dllexport)を使う形式の方です。  呼び出し側はVC6.0EnterPrize(SDK)を使います。 (諸事情により6.0以上にUPすることは不可能)     まず、静的リンクをし、関数を呼び出してみました。  (設定のリンクよりlibをリンクさせ、ヘッダをインクルードして)  すると以下のメッセージが出てしまいます。 リンク中... Dialog1.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) void __cdecl Init(unsigned char *,unsigned char *,unsigned char *,unsigned char *)" (__imp_?Init_Card@@YAXPAE000@Z)" は未解決です Debug/CardMake.exe : fatal error LNK1120: 外部参照 1 が未解決です 。 link.exe の実行エラー    色々やってみましたが、このエラーから回避できませんでした。  ヘッダ自体に #ifdef _USRDLL #define DLL_PORT __declspec(dllexport) #else #define DLL_PORT __declspec(dllimport) #endif    の宣言があるので、別に特別なことをしなくても、大丈夫そうなのですが、何故か出来ません。  次に動的リンクを行っていました。  するとLoadLibraryでエラーになり、GetLastErrrorで14001(エラーメッセージはつかめず)が返ってきました。 (色々調べたところ定義ファイルがないと動的リンクはできないようですね)    というわけでにっちもさっちも行かなくなった状況です。  そこでご質問です。 (1)定義ファイルを使わない形式のライブラリ(暗示的に定義されているもの)はどのように呼び出させばよいでしょうか? (2)2005のライブラリを6.0から呼び出すことは可能ですか?  また呼び出す方法は?  すいませんがご回答をお願いします。

  • DLL呼び出しAPのリンクエラーについて

    DLL作成初心者です。 当方で簡単なDLLを作成しました。 試しに、下記の呼び出しAP(EXE)を作成しようと したのですが、リンクエラーになります。 どうしてでしょうか? 呼び出しAP #include <windows.h> int main(){ static HINSTANCE hDLL; hDLL = LoadLibrary(TEXT("DLL_TEST.DLL")); if (hDLL) FreeLibrary(hDLL); return 0; } リンクエラーは下記 IBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Debug/TEST.exe : fatal error LNK1120: 外部参照 1 が未解決です また上記"_WinMain@16"のライブラリーをリンクさせると SCRNSAVE.LIB(scrnsave.obj) : error LNK2005: _main はすでに test.obj で定義されています SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverProc@16" は未解決です SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverConfigureDialog@16" は未解決です SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_RegisterDialogClasses@4" は未解決です Debug/TEST.exe : fatal error 等のエラーになります。 解決策を教えてください。

  • VB6で作成したDLLをVC6で使用する方法

    VB6で作成したDLLをVC6で使用できなくて困っています。 以下にトライしたことを示します。 (1) VB6でTRUEを返すだけの関数を入れたActiveX DLLを作成 (2) VC6のLoadLibraryに成功(戻り値がNULL以外) (3) VC6のGetProcAddressに失敗(戻り値がNULL) (4) VC.NET付属のDumpbinユーティリティでは(1)で作成した関数が表示されない。 何が悪いのでしょうか。 宜しくお願いします。

  • BCB5からBCB6へのコンポーネント移行でエラー

    OS:Windows XP Pro .pasのコンポーネントをインストールしようとすると下記のエラーが発生します。 [リンカエラー]外部シンボル'__fastcall Outline::TCustomOnline::~TCustomOutline()'が未解決(C:\Program Files\Borland\CBulder6\LIB\BCBSMP.LIB|.\cdiroutl.cppが参照) どなたか原因等知っていましたらご教授願います。

  • C++でdllの呼び出しについて

    使用環境はVisualStudio2008、WindowsXPです。 http://www.voidtools.com/Everything-SDK.zip こちらのSDKに添付されているdllを呼び出したいと思います。 dll、lib、ヘッダーファイルをプロジェクトと同じフォルダに入れて以下のようなコードを書いてみたのですが、リンカエラーになりました。 #pragma comment(lib, "everything.lib") void __stdcall Everything_SetSearch(LPCTSTR lpString); void main(void){ Everything_SetSearch(L"ああ"); } ビルドエラーの内容 error LNK2019: 未解決の外部シンボル "void __stdcall Everything_SetSearch(wchar_t const *)" (?Everything_SetSearch@@YGXPB_W@Z) が関数 _main で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。 何か初歩的なミスをしている気もしますが、突っ込みなどなど回答の方よろしくお願いします。