解決済みの質問
質問:No.7040857
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数5
閲覧数1023
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 が未解決です。


何か初歩的なミスをしている気もしますが、突っ込みなどなど回答の方よろしくお願いします。
投稿日時 - 2011-09-29 02:40:09
質問者が選んだベストアンサー
回答:No.4
Everything.libの内容をみると、該当の関数は次のようになっています。
※ dumpbin /EXPORTS Everything.lib で確認できます(それぞれPath必要)

_Everything_SetSearchA@4
_Everything_SetSearchW@4

質問者さんのリンクのエラーを見ると、これら関数が次のような名称でなければ一致しないことになります。

?Everything_SetSearch@@YGXPB_W@Z

この違いに対してextern "C"を用いて関数名を調整します。
http://www.geocities.jp/ky_webid/cpp/language/038.html
質問者さんが、
void __stdcall Everything_SetSearch(LPCTSTR lpString);
と記載しているところを
extern "C"{
#include "Everything.h"
}
に変更します。

これで解決するのではないでしょうか。
投稿日時 - 2011-09-29 11:06:47
この回答を支持する
(現在0人が支持しています)
お礼
仰る通りにしたら無事に実行できました。
なるほどオーバーロードがあるC++では、名前が被らないように文字列が付け足されるんですか。
だからextern "C"が必要と。
また一つ勉強になりました、ありがとうございます。
投稿日時 - 2011-09-29 23:01:30
この質問は役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答
回答:No.5
私が勘違いしておりました・・・・・。

.cpp のソースだだと C++ の規定ですもんね(タイトルに C++ からの呼び出しって書いてありますもんね・・・・・・)。

最初に紛らわしい回答して本当にごめんなさい。
投稿日時 - 2011-09-29 12:46:05
この回答を支持する
(現在0人が支持しています)
お礼
いえいえ、回答を頂けるだけでありがたいです。
それに何がきっかけで解決に繋がるか分かりませんから、お気になさらないで下さい。
投稿日時 - 2011-09-29 23:04:22
回答:No.3
普通にビルド出来たけど…

#include "stdafx.h"
extern "C" {
#include "Everything.h"
}

#pragma comment(lib, "everything.lib")


int _tmain(int argc, _TCHAR* argv[])
{
Everything_SetSearch(_T("ああ"));
return 0;
}
投稿日時 - 2011-09-29 07:18:04
この回答を支持する
(現在0人が支持しています)
お礼
回答ありがとうございます。。
やっぱり凡ミスでしたか、いやはや。
投稿日時 - 2011-09-29 22:53:15
回答:No.2
C++からCの関数を呼び出す方法を調べてみてください。
投稿日時 - 2011-09-29 07:06:01
この回答を支持する
(現在0人が支持しています)
お礼
回答ありがとうございます。
extern "C"の存在をすっかり忘れてました。
投稿日時 - 2011-09-29 22:51:17
回答:No.1
解決しましたでしょうか・・・・・・・。なんでだろ?と思ってちょっとそのライブラリ見てみました。ほんとにそのソースでコンパイルしているとしたら、まずは include ファイルの中身眺めてみるといいとおもいます・・・・・・。

いろいろ気がついてくれれば・・・・・と思い、スミマセン。
投稿日時 - 2011-09-29 03:46:45
この回答を支持する
(現在0人が支持しています)
補足
ちなみに宣言部分を以下のようにしてみましたがリンカエラーは変わりませんでした。
__declspec(dllimport) void __stdcall Everything_SetSearchW(LPCWSTR lpString);

また、最初はヘッダーファイルをincludeしていたのですが
#pragma comment(lib, "everything.lib")
#include "Everything.h"

void main(void){
Everything_SetSearch(L"ああ");
}
error LNK2019: 未解決の外部シンボル "__declspec(dllimport) void __stdcall Everything_SetSearchW(wchar_t const *)" (__imp_?Everything_SetSearchW@@YGXPB_W@Z) が関数 _main で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。
投稿日時 - 2011-09-29 04:40:14
お礼
回答ありがとうございます。
でもすみません、分かりませんでした。
丁寧なヒントを下さったのに申し訳ないです。
投稿日時 - 2011-09-29 04:17:20
もっと聞いてみる
関連するQ&Aはこちら
初歩的な質問ですが、解答をお願いします。 VCで、簡単なプログラムを組んでいますが、ヘッダーファイルをコンパイルしようとすると… 「sengen.h」に関連したコンパイルツールが無いためコンパイルでき...
現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。 このプログラムで、 if( IsSupported(OpenDialog->FileName.c_str(...
BorlandC++で、以下のエラーが出て、>[リンカ エラー] Fatal: Access violati... BorlandC++で、以下のエラーが出て、 >[リンカ エラー] Fatal: ...
この他の関連するQ&Aをキーワードで探す
プログラミングのサブカテゴリ
カテゴリ:C・C++
RSS
-PR-
PR
-PR-