游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1234|回复: 0

求助,调用动态链接库的问题.

[复制链接]

83

主题

196

帖子

196

积分

注册会员

Rank: 2

积分
196
发表于 2008-5-4 09:29:00 | 显示全部楼层 |阅读模式
下面是动态链接库中的代码:
HHOOK hhk = NULL;
......
//安装钩子
_declspec(dllexport) VOID SetHook(){
       if( !hhk ){
              HINSTANCE hInst = LoadLibrary(TEXT("print2.DLL") );
              if( hInst )
                          {
                                     MessageBoxW(NULL,L"ZZZZZZZZZZ!",L"Hook",MB_OK);
                     return;
                          }
              hhk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInst,0);
              FreeLibrary( hInst );
       }
}
//?载钩子
_declspec(dllexport) VOID UnHook(){
       if( hhk ){
              HINSTANCE hInst = LoadLibrary(TEXT("print2.DLL") );
              if( !hInst )
                          {
                                     MessageBoxW(NULL,L"uuuuuuuuuu!",L"Hook",MB_OK);
                     return;
                          }
                  
          /* ModifyIAT(
                     hCurrentProcess,
                     "USER32.DLL",
                     (PROC)MyMessageBoxW,
                     GetProcAddress( GetModuleHandle("USER32.DLL"),"MessageBoxW" )                 
                     );*/
              UnhookWindowsHookEx( hhk );
              FreeLibrary( hInst );

       }
}

下面是调用动态链接库的代码
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     switch (message)
     {
     case WM_CREATE:
               {
                      //PROC SetHook;
                      HINSTANCE hInst = LoadLibrary(DLLNAME);
                      if( !hInst ){
                             DestroyWindow(hwnd);
                             MessageBox(hwnd,TEXT("Can not load dll!"),TEXT("HOOKAPI"),MB_ICONHAND);
                             PostQuitMessage(0);
                             return 0;
                      }
                                          typedef void (*SETHOOK)();
                                          SETHOOK
                      SetHook = (SETHOOK)GetProcAddress(hInst,"SetHook");
                      if( !SetHook ){
                             DestroyWindow(hwnd);
                             MessageBox(hwnd,TEXT("Can not find function-SetHook!"),TEXT("HOOKAPI"),MB_ICONHAND);
                             PostQuitMessage(0);
                             return 0;
                      }
                      //安装钩子,这样我们的dll就被映射到每一个gui程序的进程空间中
                      SetHook();
                      FreeLibrary(hInst);
                      return 0 ;
               }
     case WM_DESTROY:
               {
                      PROC UnHook;
                      HINSTANCE hInst = LoadLibrary(DLLNAME);
                      if( !hInst ){
                             MessageBox(hwnd,TEXT("Can not load dll!"),TEXT("HOOKAPI"),MB_ICONHAND);
                             PostQuitMessage(0);
                             return 0;
                      }
                      UnHook = GetProcAddress(hInst,"UnHook");
                      if( !UnHook ){
                             MessageBox(hwnd,TEXT("Can not find UnHook!"),TEXT("HOOKAPI"),MB_ICONHAND);
                             PostQuitMessage(0);
                             return 0;
                      }
                      //退出之前我们要?载钩子
                      UnHook();
                      PostQuitMessage (0) ;
                      return 0 ;
               }
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

调试,弹出下面的BOX,不知何故?
sf_20085492848.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 15:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表