MFC 创建带窗口的dll链接库.窗口为非模态窗口

原创 2016年06月01日 18:13:25

语言:VS2008

代码实现功能:创建一个MFC Regular Dll链接库。要求链接库注入到目标进城后能调出Dll内部的MFC窗口.目标进程为第三方进程程序


步骤:

1,创建项目->MFC Dll;

2,在自动生成的项目代码中添加 Dialog对话框资源.

3,为对话框资源添加 窗口类

4,声明一个呼出窗口函数.startmythread.此函数可以导出也可以不导出  导出需要前缀:。此函数用于自己的程序 CreateRemoteThread 中远程线程调用.使用 extern "C" __declspec(dllexpot) ;

5,在startmythread 调用::CreateThread()函数创建线程.此线程实现函数thr内部为创建窗口和消息循环的代码.

6.创建非模态窗口   void ShowTreeDlg()
{
//=(HWND)329282;
//HWND hMainWnd=FindWindowA("#32770","CheckMyDriver");//通过遍历窗口方式获取目标进程主窗口句柄
HWND hMainWnd=GetHwndByProcessId(GetCurrentProcessId());//通过进程获取目标主窗口进程.注意:GetCurrentProcessId为目标进程Pid
if(hMainWnd!=0)
{
char a[10]={0};

itoa((ULONG)hMainWnd,a,10);

// MessageBoxA(NULL,(LPSTR)a,"",0);

}
else
{
//MessageBoxA(NULL,"调用失败","",0);
return;
}

AFX_MANAGE_STATE(AfxGetStaticModuleState());//这句必不可少

cDlg=new CMDlg;
CWnd *pMainWnd=CWnd::FromHandle(hMainWnd);
ASSERT(pMainWnd);
BOOL retValue=cDlg->Create(IDD_DIALOG1,pMainWnd);
if (!retValue)
{
//MessageBoxA(NULL,"error","1",MB_OKCANCEL);
}
cDlg->ShowWindow(SW_SHOW);



}

7,线程函数thr实现

thr()

{

ShowTreeDlg();

MSG msg;//消息循环  如果dll宿主程序为自己调用的程序 消息循环可以不需要 如果宿主程序为第三方进程 如果没有消息循环 调用后窗口会闪退.
while (GetMessage(&msg, NULL, 0, 0))

TranslateMessage(&msg); 
DispatchMessage(&msg); 
}

}

8,当自己的程序远程注入dll后 需要通过startmythread远程call此函数加载窗口.所以需要把startmythread函数地址传给自己的程序

传入方法:使用::PostMeaage(hwnd,message,w,l).hwnd可以通过Findwindow获取 ..message消息类型需要自己定义.WM_USER 以上的消息值.

为什么不使用SendMessage?本人exe程序和dll程序会卡死.

9 把8里面的实现代码放到CMyApp::InitInstance()内部.自己exe程序就会接收到startmythread函数地址.然后通过CreateReMoteThread调用之.


注意的问题:

1,为什么创建窗口要放在线程里.因不放在线程里后面的消息循环会把dll卡死.从而整个进程无响应.

2,为什么不把startmythead直接放在InitInstatce调用.因为在其内部创建线程dll同样会卡死.


看似一个简单的dll窗口调用 花了两天时间才搞定.新手伤不起.



在DLL中使用对话框资源

在CSDN论坛上最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题。这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题。 ...
  • woshibendangao
  • woshibendangao
  • 2015年01月19日 10:22
  • 2422

MFC 创建非模态对话框和销毁过程

今天项目中遇到的问题,记录下来,做个总结。 一个简单的目的是创建一个非模态对话框并在对话框关闭后将其销毁。 这里的销毁包括:销毁对话框对象资源和对话框对象指针; 首先说创建对话框: 一、模态对话框(m...
  • xiaominggunchuqu
  • xiaominggunchuqu
  • 2015年11月17日 23:29
  • 5436

MFC非模态窗口的销毁过程

非模态对话框相对于模态对话框,他的创建和销毁过程和模态对话框有一定的区别 先看一下MSDN的原文:When    you    implement    a    modeless    dialog...
  • shuangmin
  • shuangmin
  • 2011年07月26日 09:16
  • 312

MFC 模态、非模态窗口引发的系列事件及函数

标题一:创建模态窗口 标题二:创建非模态子窗
  • qq_26728227
  • qq_26728227
  • 2016年05月06日 14:03
  • 1044

模态非模态窗口的创建及销毁

前几天发现自己的程序中使用非模态对话框,Debug版本有警告提示如下:     Warning: calling DestroyWindow in CWnd::~CWnd OnDestroy or ...
  • shuaiqidiudiu
  • shuaiqidiudiu
  • 2013年05月18日 16:04
  • 540

MFC之如何弹出模态窗口

首先,说一下什么是模态窗口、什么是非模态窗口。 模态窗口:弹出之后只能在该窗口内操作,只有关闭该窗口之后才能进行对其他窗口进行操作。否则为非模态窗口。 当我们在做MFC设计的时候,我们也许想要点击...
  • qq_34791215
  • qq_34791215
  • 2017年06月12日 18:56
  • 147

使用jQuery创建模态窗口登陆效果

  • 2015年07月29日 15:34
  • 36KB
  • 下载

弹出层时,锁屏带模态窗口

  • 2011年12月15日 13:10
  • 958B
  • 下载

可拖拽的非模态窗口(满足在特定区域内)--bootstrap样式

  • 2017年12月12日 14:39
  • 40KB
  • 下载

Qt实现两个非模态窗口的数据传递(信号与槽方式)

我尝试过定义全局变量,但是怎么都无法运行成功,所以换信号与槽方式。我这里的实现是,在一个窗体内的LineEdit中输入一段文本,点击一个按钮控件后,输入的文本显示在另一个独立的窗口中的LineEdit...
  • qq_32555215
  • qq_32555215
  • 2016年12月03日 20:59
  • 894
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 创建带窗口的dll链接库.窗口为非模态窗口
举报原因:
原因补充:

(最多只允许输入30个字)