比如将来注入到QQ程序.我自己写了一个MFCDLL
InitInstance()
{
      CMyDlg dlg; //资源对话框生成的类
      dlg.DoModal();
}当然,在InitInstance里创建线程可以解决这个问题.但我就是不明白..这个MFC DLL,我是用创建远程线程的方法注入到QQ进程的..为什么dlg窗口显示后. QQ窗口被卡住???

解决方案 »

  1.   

    DoModal内部带有消息循环,会拦截发给其父窗口的消息。CDialog的构造函数默认将应用程序的主窗口作为其父窗口,所以会有这样的问题。可以用非模态方式来解决这个问题。
      

  2.   

    在DllMain中新开一个线程,在新开的线程中启动对话框即可,否则整个QQ进程中只有DllMain的线程活动,其它被线程挂起,原因请看windows核心编程中的解释。
      

  3.   

    看来只有
    DWORD _stdcall threadFun()
    {
          CMyDlg dlg; //资源对话框生成的类 
          dlg.DoModal(); 
    }InitInstance() 

        CreateThread(0, 0, threadFun, 0, 0 , &id);
    } 我想实现. 当CMyDlg窗口点击关闭按钮后, 这个dll资源从QQ进程释放...请问怎么做?
      

  4.   

    如果是用DoModal,只要把自己加载或分配的资源都释放就可以。
    如果是非模态,响应WM_CLOSE消息,调用DestroyWindow销毁对话框,再PostQuitMessage使消息循环结束。
    最后返回FALSE,使LoadLibrary失败。
      

  5.   


    如我5楼所写,我用的是模态的..
    点我当击CMyDlg窗口的退出后, DLL还在QQ进程中...
    而好像自己又不能FreeLibrary自己..所以不知道怎么解决..?
      

  6.   

    程序不能自己卸载自己,不过可以借助栈来实现,用嵌入汇编的方式push参数和返回地址,然后jmp到FreeLibrary的入口,使其返回到ExitThread函数入口。
    你还可以在注入代码的时候多写几条指令,在LoadLibrary之后,GetProcAddress并调用一个导出函数,可以在这个函数中创建线程并等待线程结束,函数返回后再调用FreeLibrary。
    不过最简单的方法还是用非模态对话框,把对话框的创建、显示和消息循环都做在InitInstance函数里面,最后函数返回FALSE自动卸载。
      

  7.   

    用RawPeApi库吧,完全可以满足你的要求,而且代码简单。
      

  8.   

    关注类似问题,dll中对话框,在其他程序中调用该对话框。