首页
社区
课程
招聘
[原创]Win32&MFC DLL被动加载完美显示对话框并对应热键呼入呼出
发表于: 2015-11-30 17:32 5423

[原创]Win32&MFC DLL被动加载完美显示对话框并对应热键呼入呼出

2015-11-30 17:32
5423

本人小菜菜,大神勿喷。
只是对于这几天来鼓捣DLL如何使用对话框并且在被动加载的时候正确显示出来做出以下总结(因为网上大部分都没达到我的要求):
    
    首先说下自己想要实现的效果:
      将制作好的DLL注入宿主程序(被动加载)后立马显示此对话框,并且在对话框的初始化函数处设置键盘钩子用来呼入呼出此窗口。

    要实现上面的效果会遇到以下难题:
    1.win32和MFC(规则)的DLL如何使用对话框资源。
    2.目标程序(暂且称为宿主程序)在加载此DLL(可能主动  可能被动)的时候显示此对话框并设置键盘钩子使其有效。

1.先介绍Win32程序:
   对于上面第1点 Vc驿站的Syc老大 有两篇帖子讲过
 http://www.cctry.com/thread-5516-1-1.html
 http://www.cctry.com/thread-5517-1-1.html
   但是他是下面这种方式进行调用的即导出方式,
   extern "C" __declspec(dllexport) void ShowDlg()
   {
       hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DLG_SHOW),NULL,(DLGPROC)DlgProc);
       ShowWindow(hwndDLG, SW_SHOW)
   }
   得专门写个对应的DLL 注入工具并调用DLL导出函数,此时大部分同学可能会想到把此导出函数ShowDlg直接放到DLL_PROCESS_ATTACH:后面会不会行呢?
   switch(ul_reason_for_call)
       {
       case DLL_PROCESS_ATTACH:
              hinst = (HINSTANCE)hModule;
              ShowDlg()  ;//放这
       case DLL_PROCESS_DETACH:
              break;
       }
    答案是:  如果宿主程序主动加载此Dll的话是可以的,但是通过远程线程注入的话貌似是不显示的具体原因不得而知。
    但是这里有个方法可以解决被动加载DLL的时候让对话框显示,就是在DLL中创建线程让新线程去创建窗口具体做法是:

     switch(ul_reason_for_call)
       {
       case DLL_PROCESS_ATTACH:
              hinst = (HINSTANCE)hModule;
              CloseHandle(CreateThread(NULL, 0, ThreadProc, this, 0, &ThreadID));  //这里创建线程具体看线程回调函数
       case DLL_PROCESS_DETACH:
              break;
       }

     
       //这里是线程回调函数
       DWORD WINAPI ThreadProc(PVOID pArg)
      {
         //这里创建并显示对话框
         hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);
         ShowWindow(hwndDLG, SW_SHOW);
        
        //这里函数很重要,这是新开的线程执行函数 要想显示上面创建的对话框 就必须加上下面的消息loop
        MSG msg;
        while(GetMessage(&msg,NULL,0,0))
         {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
         }

         return 1;
       }
       很多同学上面不加消息循环也会不显示,具体也可以看这篇帖子:http://blog.csdn.net/norains/article/details/2023957
       差不多就这样  对于MFC DLL可以参考Win32的  原理一样。 
       最后附上我的源码包含HOME键呼入呼出对话框.
        Src.7z


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//