二、从DLL中传递消息到EXE

二、从DLL中传递消息到EXE

   在DLL中定义消息和上面的方法很相似,有两点不同的地方:

   1、在DLL和应用程序中两个地方定义相同的消息。

   2、应用程序调用DLL程序之后,需要将应用程序的窗口句柄传递给DLL,以便DLL中的消息返回。

   在DLL工程中:

   (1)在stdafx.h头文件中添加消息定义:

 #define WM_MSG WM_USER + 102

   (2)添加启动消息的输出函数:

 

   CMessageDLLApp theApp;

   //发送消息

extern "C" _declspec(dllexport) void StartSendMessage(HWND hwnd)

   {

   theApp.SendMessage(hwnd);

   }

   其中hwnd是接收消息的窗口句柄。

   (3)添加启动消息的实现函数:

   在头文件中添加函数声明:

 void SendMessage(HWND hwnd);

   在CPP文件中添加函数实现

   //启动发送消息

 

void CMessageDLLApp::SendMessage(HWND hwnd)

   {

   ::PostMessage(hwnd,WM_MSG,0,1);

   }

   在应

用程序中:

   (1)在stdafx.h头文件中添加消息定义:

 #define WM_MSG WM_USER + 102

   (2)首先在AFX_MSG块中加入消息声明:在CTestMessageDLLDlg.h中,找到如下部分,并加入消息声明:

   。。。。。。

 

   afx_msg LRESULT OnMyMsg(WPARAM wParam,LPARAM lParam);

   DECLARE_MESSAGE_MAP()

   (3)在MESSAGE_MAP块中添加ON_MESSAGE宏指令:

 

   BEGIN_MESSAGE_MAP(CTestMessageDLLDlg, CDialog)

   。。。。。。

   ON_MESSAGE(WM_MSG, OnMyMsg)

   //}}AFX_MSG_MAP

   END_MESSAGE_MAP()

   (4)添加消息函数体:

 LRESULT CTestMessageDLLDlg::OnMyMsg(WPARAM wParam, LPARAM lParam)

   { 

   AfxMessageBox("消息已经收到!");

   return 0;

   }

   (5)在对话框上添加一个按钮,在按钮事件中,先调用DLL文件,然后发送一个测试消息响应的命令:

 

void CTestMessageDLLDlg::OnBnClickedButton1()

   {

   // TODO: 在此添加控件通知处理程序代码

   //定义函数

   typedef void (_cdecl*STARTSENDMESSAGE)(HWND hwnd);

   HMODULE hmessage = NULL;

   STARTSENDMESSAGE StartSendMessage = NULL;

   //导入DLL库文件

   hmessage = LoadLibrary("MessageDLL.dll");

   if(hmessage==NULL)

   {

   FreeLibrary(hmessage);

   exit(0);

   }

   //导入DLL中测试消息函数

   StartSendMessage = (STARTSENDMESSAGE)GetProcAddress(hmessage,"StartSendMessage");

   if(StartSendMessage==NULL)

   {

   FreeLibrary(hmessage);

   exit(1);

   }

   //获取对话框的窗口句柄

   HWND hwnd = this->GetSafeHwnd();

   //发送测试消息函数

   (*StartSendMessage)(hwnd);

   }

运行应用程序,就可以看到测试结果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值