プロが教える店舗&オフィスのセキュリティ対策術

使用環境は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 が未解決です。


何か初歩的なミスをしている気もしますが、突っ込みなどなど回答の方よろしくお願いします。

A 回答 (5件)

解決しましたでしょうか・・・・・・・。

なんでだろ?と思ってちょっとそのライブラリ見てみました。ほんとにそのソースでコンパイルしているとしたら、まずは include ファイルの中身眺めてみるといいとおもいます・・・・・・。

いろいろ気がついてくれれば・・・・・と思い、スミマセン。

この回答への補足

ちなみに宣言部分を以下のようにしてみましたがリンカエラーは変わりませんでした。
__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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
でもすみません、分かりませんでした。
丁寧なヒントを下さったのに申し訳ないです。

お礼日時:2011/09/29 04:17

C++からCの関数を呼び出す方法を調べてみてください。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
extern "C"の存在をすっかり忘れてました。

お礼日時:2011/09/29 22:51

普通にビルド出来たけど…



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

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


int _tmain(int argc, _TCHAR* argv[])
{
Everything_SetSearch(_T("ああ"));
return 0;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。。
やっぱり凡ミスでしたか、いやはや。

お礼日時:2011/09/29 22:53

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/03 …
質問者さんが、
void __stdcall Everything_SetSearch(LPCTSTR lpString);
と記載しているところを
extern "C"{
#include "Everything.h"
}
に変更します。

これで解決するのではないでしょうか。
    • good
    • 1
この回答へのお礼

仰る通りにしたら無事に実行できました。
なるほどオーバーロードがあるC++では、名前が被らないように文字列が付け足されるんですか。
だからextern "C"が必要と。
また一つ勉強になりました、ありがとうございます。

お礼日時:2011/09/29 23:01

私が勘違いしておりました・・・・・。



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

最初に紛らわしい回答して本当にごめんなさい。
    • good
    • 0
この回答へのお礼

いえいえ、回答を頂けるだけでありがたいです。
それに何がきっかけで解決に繋がるか分かりませんから、お気になさらないで下さい。

お礼日時:2011/09/29 23:04

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