• 締切済み

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; } それでは、よろしくお願いします。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

「error LNK2019: 未解決の外部シンボル」で検索すればわかると思いますが C/C++コンパイラから実行ファイルを作るときは、最後に「リンク」という工程があります。 このとき、.objや.libにあるシンボルを「結び付ける(リンクさせる)」ことで使える状態にします。 自分で定義したことのないprintfやscanf等が使えるのは、既にあるものとリンクさせているからです。 そのシンボルが見つからないときに出るのが、そのエラーです。 主な原因は次のものです。 ・使ってるはずのものが実際には無かった。(名前の間違い等) ・実体が入っている.obj,.lib等がリンクの入力に無い で、そのサイトを見ると > ■ Detoursを使う >「プロジェクトにdetours.libをリンクさせて」ビルドします。 とあります。これが抜けてるのでは? プロジェクトの設定のリンカのところに追加してください。

関連するQ&A

  • DB2付きのC言語がコンパイルできません。

    CはMicrosoftVisualStudio2012 DBはIBM DB2 です。 同じ環境でコンパイル実行できていたのに、 PCがおかしくなったのでフォーマットして入れなおしたらコンパイルができなくなりました。 よろしくおねがいします。 ソースはこちらです。 #include <stdio.h> exec sql include sqlca; void main() { exec sql connect to sample; if(SQLCODE!=0) { printf("SQL CONNECT %d", SQLCODE); } else { exec sql update Test1 set col2 = 'bababa'; if(SQLCODE!=0) printf("SQL UPDATE %d", SQLCODE); } exec sql connect reset; } コンパイルコマンドです db2 connect to sample db2 prep Test11.sqc bindfile db2 bind Test11.bnd cl -Z7 -c -W2 -D_X86_=1 -DWIN32 -I"c:\Program Files\IBM\SQLLIB\include" Test11.c link -debugtype:cv -outTest11.exe %1.obj "c:\Program Files\IBM\SQLLIB\lib\db2api.lib" エラーメッセージです Test11.obj : error LNK2019: 未解決の外部シンボル _sqlaaloc@16 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlacall@20 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlasetdata@24 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastop@4 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastrt@12 が関数 _main で参照されました。 Test11.exe : fatal error LNK1120: 5 件の未解決の外部参照

  • C言語についてです。

    プログラムを実行しようとすると、 main.obj : error LNK2001: 外部シンボル ""void __cdecl DrawGameOver(void)" (?DrawGameOver@@YAXXZ)" は未解決です。 fatal error LNK1120: 外部参照 1 が未解決です。 とでてしまいます。 どうすれば解決するのでしょうか? 初心者なのでなるべく分かりやすくお願いします。

  • C++でのエラー LNK2001

    C++でプログラミング中ビルドしたところ以下のようなエラーが出ました。解決方法がわかりません。どのようにしたら解決できるのでしょうか? ---------------------------------------------------------------- コンパイル中... sample01.cpp リンク中... sample01.obj : error LNK2001: 外部シンボル "__imp__dispose_library" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_copyright_information" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_version_information" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__initialize_library" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__close_reader_writer" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_last_error_types" は未解決です Debug/Sample01.exe : fatal error LNK1120: 外部参照 6 が未解決です。 link.exe の実行エラー

  • 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 等のエラーになります。 解決策を教えてください。

  • c言語とfortranの混在プログラミング

    cとfortranの混合プログラミングについての質問です。環境はWindows上でVisual studio 2005/Intel fortran 9.1です。 --c側(ctest6.cpp) #include <stdio.h> extern "C" void __stdcall fsub(){ printf("TEST PROGRAM!!\n"); } --fortran側(ftest6.f90) PROGRAM MAIN call FSUB END --エラー ctest6.obj:error LNK2019:未解決の外部シンボル_fsubが関数_mainで参照されました。 ftest6.obj:error LNK2019:未解決の外部シンボル_FSUBが関数_MAIN_で参照されました。 ftest6.exe:fatal error LNK1120:外部参照2が未解決です。 ---- __stdcall fsub()"の部分を過去の質問等を参考にし、色々(cのfsubを_fsubやfsub_にしたりと"_"を追加したり)と試してみたりしたのですが、上記のエラーがでてしまいます。fortran側で_FSUBと記入できない点が課題な気がしているのですが、ご教授いただけないでしょうか?

  • Visual C++ 2005 Express EditionでLINK2019エラー

    Visual C++ 2003.netからVisual C++ 2005 Express Editionに移行した際に、以前書いたプログラムがリンクエラーで動かなくなってしまいました。 追加するLibディレクトリが足りないのかと思ったのですが、何が足りないのか見つけることができませんでした。 解決法を教えていただけないでしょうか。 OSはWindows XPです。 よろしくお願いします。 エラーメッセージの内容↓ ------------------------------- error LNK2019: 未解決の外部シンボル __imp__GetWindowPlacement@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DispatchMessageA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__TranslateMessage@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PeekMessageA@20 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ValidateRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ShowWindow@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__SetWindowPos@28 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetWindowRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetClientRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__CreateWindowExA@48 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetSystemMetrics@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__RegisterClassExA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__LoadCursorA@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DefWindowProcA@16 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PostQuitMessage@4 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 現在追加されているLibディレクトリ↓ ------------------------------------------- $(VCInstallDir)lib $(VCInstallDir)PlatformSDK\lib $(FrameworkSDKDir)lib $(VSInstallDir) $(VSInstallDir)lib C:\Program Files\Microsoft Platform SDK\Lib C:\Program Files\Microsoft DirectX SDK (April 2007)\Lib\x86

  • 外部シンボル未解決 LNK2001

    外部シンボル未解決 LNK2001 外部シンボル未解決 LNK2001 今windowsXP32bitからwindowsXP64bitPCでのデバッグを行おうとしています。 開発環境VC++2005です。 しかし、32bitPCでは、エラーなどなかったのですが64bitPCだと次のようなエラーが発生しました。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DP8SP_TCPIP" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlay8Address" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlay8Address" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlay8Client" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlay8Client" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultCapture" は未解決です。 5>MainteDlg.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultCapture" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultPlayback" は未解決です。 5>MainteDlg.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultPlayback" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlayVoiceClient" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlayVoiceClient" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "PIN_CATEGORY_PREVIEW" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_IBasicVideo" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "CLSID_VideoInputDeviceCategory" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "CLSID_SystemDeviceEnum" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_ICreateDevEnum" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_IMediaControl" は未解決です。 とエラーがでています。 一応構成マネージャーの設定は、64x設定しています 何か設定などたりないのでしょうか? よろしくお願いします。

  • プロジェクトを作った際のエラー

    VisualC++ 2005 Express Editionを使用してます win32コンソールアプリケーション - アプリケーション設定 - windowsアプリケーション この新しく作ったプロジェクトを何もいじらずにビルドすると __imp__EndPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__BeginPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DefWindowProcW@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DestroyWindow@4 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DialogBoxParamW@20 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__EndDialog@8 が関数 "int __stdcall About(struct HWND__ *,unsigned int,unsigned int,long)" (?About@@YGHPAUHWND__@@IIJ@Z) で参照されました。 C:\C++test\test\Debug\test.exe : fatal error LNK1120: 外部参照 19 が未解決です。 というエラーが出てしまいます 800文字オーバーしてしまうのでエラーの前半部分を消してあります この原因と解決方法を教えてください よろしくお願いします

  • 外部シンボル未解決 LNK2001

    外部シンボル未解決 LNK2001 今windowsXP32bitからwindowsXP64bitPCでのデバッグを行おうとしています。 開発環境VC++2005です。 しかし、32bitPCでは、エラーなどなかったのですが64bitPCだと次のようなエラーが発生しました。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DP8SP_TCPIP" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlay8Address" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlay8Address" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlay8Client" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlay8Client" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultCapture" は未解決です。 5>MainteDlg.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultCapture" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultPlayback" は未解決です。 5>MainteDlg.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultPlayback" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlayVoiceClient" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlayVoiceClient" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "PIN_CATEGORY_PREVIEW" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_IBasicVideo" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "CLSID_VideoInputDeviceCategory" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "CLSID_SystemDeviceEnum" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_ICreateDevEnum" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_IMediaControl" は未解決です。 とエラーがでています。 一応構成マネージャーの設定は、64x設定しています 何か設定などたりないのでしょうか? よろしくお願いします。

  • 外部シンボル未解決 LNK2001

    外部シンボル未解決 LNK2001 今windowsXP32bitからwindowsXP64bitPCでのデバッグを行おうとしています。 開発環境VC++2005です。 しかし、32bitPCでは、エラーなどなかったのですが64bitPCだと次のようなエラーが発生しました。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DP8SP_TCPIP" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlay8Address" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlay8Address" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlay8Client" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlay8Client" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultCapture" は未解決です。 5>MainteDlg.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultCapture" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultPlayback" は未解決です。 5>MainteDlg.obj : error LNK2001: 外部シンボル "DSDEVID_DefaultPlayback" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "CLSID_DirectPlayVoiceClient" は未解決です。 5>DirectPlay.obj : error LNK2001: 外部シンボル "IID_IDirectPlayVoiceClient" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "PIN_CATEGORY_PREVIEW" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_IBasicVideo" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "CLSID_VideoInputDeviceCategory" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "CLSID_SystemDeviceEnum" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_ICreateDevEnum" は未解決です。 5>DirectShow.obj : error LNK2001: 外部シンボル "IID_IMediaControl" は未解決です。 とエラーがでています。 一応構成マネージャーの設定は、64x設定しています 何か設定などたりないのでしょうか? よろしくお願いします。

専門家に質問してみよう