none
DLLからDLLを呼び出す方法 RRS feed

  • 質問

  • VC2008でDLLを作成しようと思っています。
    このDLLでVC6.0で作成されたであろう他のDLL(***dll.dll)をインポートしたいのですが、上手くいきません。

    他のDLLというのはdefファイルでエクスポートしたもので.libと.dllファイルがあるので
    静的なインポートをしようとしました。

    .libファイルを#pragma comment(lib, "***dll.lib")でリンクして
    ***dll.dllを実行フォルダに配置してBBBという関数を使用しようとしたところ

    error LNK2019:未解決の外部シンボル _BBB が関数 _AAAA で参照されました。
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・: fatal error LNK1120: 外部参照 1 が未解決です。

    というようなエラーが出てきました。

    正しい方法を知っている方は教えていただきたいです。
    よろしくお願いいたします。

    2009年1月7日 8:39

回答

  • 他のDLL(***dll.dll)のBBB関数の定義が書かれたヘッダファイル(.h)は今回新しく作ったものですか?
    おそらくヘッダファイルの
    BBB関数定義が実際のDLLと合っていないのが原因と思います。

    試しに、仮にBBBの定義が「int BBB(int a);」だとしたらヘッダファイルの定義を「
    int __stdcall BBB(int a);」としてみてください。

    これでダメならDLLがエクスポートしている関数の完全な名前を調べます。
    DependencyWalker
    (***dll.dll)を読み込ませるとエクスポートしている関数名が表示されます。
    完全名にいくつかのパターンがありますので、それに応じた宣言に変えてください。

    <例>
    _BBB@8 →
    extern "C" int __stdcall BBB(int a);
    BBB      → extern "C" int BBB(int a);
    ?BBB@@YAHH@Z
    →  int BBB(int a);
    2009年1月7日 10:19
  • C.Johnさん、ご回答ありがとうございます。

    試しに、仮にBBBの定義が「int BBB(int a);」だとしたらヘッダファイルの定義を「int __stdcall BBB(int a);」としてみてください。

    はい。そのとおりでした。__stdcallを加えたら呼び出すことができました。

    ありがとうございました。
    2009年1月8日 4:04

すべての返信

  • 他のDLL(***dll.dll)のBBB関数の定義が書かれたヘッダファイル(.h)は今回新しく作ったものですか?
    おそらくヘッダファイルの
    BBB関数定義が実際のDLLと合っていないのが原因と思います。

    試しに、仮にBBBの定義が「int BBB(int a);」だとしたらヘッダファイルの定義を「
    int __stdcall BBB(int a);」としてみてください。

    これでダメならDLLがエクスポートしている関数の完全な名前を調べます。
    DependencyWalker
    (***dll.dll)を読み込ませるとエクスポートしている関数名が表示されます。
    完全名にいくつかのパターンがありますので、それに応じた宣言に変えてください。

    <例>
    _BBB@8 →
    extern "C" int __stdcall BBB(int a);
    BBB      → extern "C" int BBB(int a);
    ?BBB@@YAHH@Z
    →  int BBB(int a);
    2009年1月7日 10:19
  • C.Johnさん、ご回答ありがとうございます。

    試しに、仮にBBBの定義が「int BBB(int a);」だとしたらヘッダファイルの定義を「int __stdcall BBB(int a);」としてみてください。

    はい。そのとおりでした。__stdcallを加えたら呼び出すことができました。

    ありがとうございました。
    2009年1月8日 4:04