- 締切済み
C、C++言語(Detours)についての質問
Detoursを用いて、下記のWebサイト通りに試したのですが、エラーが出てAPIフックができません。(前準備までは下記の通りで成功しました) http://asd.if.land.to/code/apihook7.html 環境は、Windows7 proffesional 32bit版です。Visual Studio 2008を使っております。 プロジェクトはWin32コンソールアプリケーションで作成しており、アプリケーションの種類は、Windows アプリケーションを選択しております。 プロジェクトのディレクトリに登録したのは、 $(ProgramFiles)\Microsoft Research\Detours Express 3.0\include $(ProgramFiles)\Microsoft Research\Detours Express 3.0\lib.X86 $(ProgramFiles)\Microsoft Research\Detours Express 3.0\bin.X86 Webに記載されている通りにソースコードを書いてコンパイルするとこのようなエラーがでました。 1>test.obj : error LNK2019: 未解決の外部シンボル _DetourTransactionCommit@0 が関数 _wWinMain@16 で参照されました。 1>test.obj : error LNK2019: 未解決の外部シンボル _DetourAttach@8 が関数 _wWinMain@16 で参照されました。 1>test.obj : error LNK2019: 未解決の外部シンボル _DetourUpdateThread@4 が関数 _wWinMain@16 で参照されました。 1>test.obj : error LNK2019: 未解決の外部シンボル _DetourTransactionBegin@0 が関数 _wWinMain@16 で参照されました。 1> test.obj : error LNK2019: 未解決の外部シンボル _DetourRestoreAfterWith@0 が関数 _wWinMain@16 で参照されました。 Detoursを用いたAPIフックの勉強中のためご教授願います。このサイトを参考にして、APIフックできた方がいましたら書き込みよろしくお願いします。 ソースコード test.cpp #include <windows.h> #include <tchar.h> #include <detours.h> // MessageBoxA INT ( WINAPI *RealMessageBoxA )( HWND, LPCSTR, LPCSTR, UINT ) = MessageBoxA; INT WINAPI DetoursMessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ) { return RealMessageBoxA( hWnd, lpText, "hook", uType ); } // GetModuleFileNameA DWORD ( WINAPI *RealGetModuleFileNameA )( HMODULE, LPSTR, DWORD ) = GetModuleFileNameA; DWORD WINAPI DetoursGetModuleFileNameA( HMODULE hModule, LPSTR lpFilename, DWORD nSize ) { //RealGetModuleFileNameA( hModule, lpFilename, nSize ); ::lstrcpyA( lpFilename, "hook" ); return 4; // 文字数を返す } INT APIENTRY _tWinMain( HINSTANCE, HINSTANCE, LPTSTR, INT ) { // フック ::DetourRestoreAfterWith(); if ( ::DetourTransactionBegin() != NO_ERROR ) return 0; if ( ::DetourUpdateThread( GetCurrentThread() ) != NO_ERROR ) return 0; ::DetourAttach( (PVOID*)&RealMessageBoxA, DetoursMessageBoxA ); ::DetourAttach( (PVOID*)&RealGetModuleFileNameA, DetoursGetModuleFileNameA ); ::DetourTransactionCommit(); // テスト CHAR szPath[ MAX_PATH + 1 ]; ::GetModuleFileNameA( NULL, szPath, MAX_PATH ); ::MessageBoxA( NULL, szPath, "exeのパスを表示", MB_OK ); return 1; } それでは、よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
「error LNK2019: 未解決の外部シンボル」で検索すればわかると思いますが C/C++コンパイラから実行ファイルを作るときは、最後に「リンク」という工程があります。 このとき、.objや.libにあるシンボルを「結び付ける(リンクさせる)」ことで使える状態にします。 自分で定義したことのないprintfやscanf等が使えるのは、既にあるものとリンクさせているからです。 そのシンボルが見つからないときに出るのが、そのエラーです。 主な原因は次のものです。 ・使ってるはずのものが実際には無かった。(名前の間違い等) ・実体が入っている.obj,.lib等がリンクの入力に無い で、そのサイトを見ると > ■ Detoursを使う >「プロジェクトにdetours.libをリンクさせて」ビルドします。 とあります。これが抜けてるのでは? プロジェクトの設定のリンカのところに追加してください。