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窗口调用 花了两天时间才搞定.新手伤不起.



相关文章推荐

VC++ WIN32 sdk实现按钮自绘详解.

  网上找了很多,可只是给出代码,没有详细解释,不便初学者理解.我就抄回冷饭.把这个再拿出来说说.实例图片:  首先建立一个标准的Win32 Application 工程.选择a simple Win...

MFC(含功能窗口及测试主窗口)的DLL生成技巧

MFC窗口的DLL生成注意事项

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

标题一:创建模态窗口 标题二:创建非模态子窗

MFC非模态窗口的销毁过程

非模态对话框相对于模态对话框,他的创建和销毁过程和模态对话框有一定的区别 先看一下MSDN的原文:When    you    implement    a    modeless    dialog...

MFC之如何弹出模态窗口

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

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

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

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

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

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

我尝试过定义全局变量,但是怎么都无法运行成功,所以换信号与槽方式。我这里的实现是,在一个窗体内的LineEdit中输入一段文本,点击一个按钮控件后,输入的文本显示在另一个独立的窗口中的LineEdit...

带返回值的模态窗口UIAlertView

转自:  http://www.cocoachina.com/bbs/read.php?tid-60136.html建议去上面的网页浏览,转载时,csdn不支持图片带返回值的模态窗口UIAlertVi...

Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法

一、简述先简单介绍一下模态与非模态对话框。模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭。这时一般需要点击对话框中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 创建带窗口的dll链接库.窗口为非模态窗口
举报原因:
原因补充:

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