如何在MFC DLL中向C#类发送消息

如何在MFC DLL中向C#类发送消息

一、 引言

由于Windows Message才是Windows平台的通用数据流通格式,故在跨语言传输数据时,Message是一个不错的选择,本文档将描述如何在MFC DLL中向C#窗口类发送消息。

二、 实现过程

1. 新建一个基于MFC的DLL工程,在工程作用是用于生成Dll库函数;

2. 在该工程中新增一个类,CMessager;

3. 在头文件中添加代码如下:

1 #define ZS_API extern "C" _declspec (dllexport) void
2
3 ZS_API _sendMessageToCS(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

4. 在CPP文件中添加代码如下:

1 ZS_API _sendMessageToCS(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
2 {
3     SendMessage(hWnd, Msg, wParam, lParam);
4 }

5. 新建一个C#的WindowsApplication的测试工程TestMfcDllMessage;

6. 添加MsgTest普通类,类中代码如下:

1 public class MsgTest
2 {
3     public const int MSG_USER = 0x400;
4     public const int MSG_TEST = MSG_USER + 0x100;
5 }

7. 添加Messager类,类中代码如下:

1 public class Messager
2 {
3     [DllImport("MfcDllSendMessage.dll", EntryPoint = "_sendMessageToCS", CharSet = CharSet.Auto)]
4
5     public static extern void _sendMessageToCS(IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);
6 }

8. 给Form1添加一个“调用MFC DLL发送消息”按钮,双击在事件响应中添加如下代码:

1 private void button1_Click(object sender, EventArgs e)
2 {
3     Messager._sendMessageToCS(this.Handle, MsgTest.MSG_TEST, 25, 13);
4 }

9. 在Form1类中重写默认窗口过程,代码如下:

 1 protected override void DefWndProc(ref Message m)
 2 {
 3     switch (m.Msg)
 4     {
 5     case MsgTest.MSG_TEST:
 6         string strInfo = string.Format("HWnd:{0}\r\nMsg:{1}\r\nWParam:{2}\r\nLParam:{3}", m.HWnd.ToString(), m.Msg.ToString(), m.WParam.ToString(), m.LParam.ToString());
 7         MessageBox.Show(strInfo);
 8         break;
 9
10     default:
11         base.DefWndProc(ref m);
12         break;
13     }
14 }

10. Build整个工程

三、 实现效果

单击“调用MFC DLL发送消息”,效果如下:

转载须知:

请尊重本人知识产权和劳动成果,本文可自由转载,请注明出处:

博客网址:http://www.cnblogs.com/zs8861/

联系邮箱:[email protected]

欢迎交流!

时间: 2024-12-09 22:05:09

如何在MFC DLL中向C#类发送消息的相关文章

非MFC的DLL中使用CString类

1.头文件添加 /* 非MFC DLL中使用CString */ #define _AFXDLL #include <afx.h> 注意:要定义在 #include<windows.h>之前,否则会报错 2.cpp 文件中添加 /* 非MFC DLL中使用CString */ // The following symbol used to force inclusion of this module for _USRDLL #ifdef _X86_ extern "C&q

[转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但能否导出类应该也不是必须用MFC才能够做到,一定是有相应的机制可以实现.于是查了一下MSDN,发现这个机制简单的可怕,原来就和导出函数一样,把dllexport关键字加到类名前就可以了.估计和我一样的同学大有人在,把MSDN的相关文档翻译出来,附上我的注解,希望对大家有用. 评注程序均在Visual S

从dll中导出c++类

简介: 动态库(DLL)从开始就作为windows平台的组成部分而存在.它以独立的模块把c函数封装起来供其他用户使用 .DLL从开始就是以封装C语言的形式而存在,当然现在你也可以封装其他语言,比如c++,而如果要实现跨平台使用DLL,则我们必须回归到C语言. 利用C语言接口并不意味着我们必须丢弃掉面向对象方法.C语言可以实现应用二进制接口(ABI),这样使调用者和被调用着可以遵从统一的标准,但是C++语言没有这个特性,导致从一个编译器生成的binary不能被另一个编译器所识别.这样使得直接导出C

从普通DLL中导出C++类 &lt;二&gt;

上一篇文章中,我们介绍了怎么从一个DLL中导出C++类,及选择性导出C++类的成员的方法.那么,整个系统的底层机制是怎么样的?是通过什么途径,使得我们可以在另一个程序中使用一个DLL中导出的类的呢? 我们知道,要使用一个C++类,必要的条件是在编译期能得到这个类的头文件,并在链接期可以找到对应的符号的链接地址(比如成员函数.静态数据成员等).如果这个C++类与你的使用者在同一个工程,那这个条件很好满足:    首先,C++类的头文件很好获得.直接在使用者那里将类的头文件include即可    

如何给对话框中的控件发送消息呢?Windows消息分类

以博文CTabCtrl中介绍的那样,给Tab添加子对话框来显示Tab内容.那么如果这个子对话框中含有个CTreeCtrl控件,有个Button控件,我想要模拟给这两个控件发送消息,该怎么办呢?直接把给控件的消息给控件容器(控件的父窗口)是没有用的.为什么呢?首先要明白windows的消息分类: Windows消息的分类 1. 标准消息(队列消息)除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,如WM_MOUSEMOVE.WM_LBUTTONUP.WM_KEYDOWN.WM_C

MFC子窗口向父窗口发送消息

MFC子窗口向父窗口发送消息(测试成功20110117) 分类: VC++学习2012-08-17 17:22 4327人阅读 评论(4) 收藏 举报 测试mfcuserc 在MFC中,使用用户自定义消息,子窗口向父窗口发送消息过程.代码: 1)在resourse.h中增加定义: //#define WM_add_event_ok (WM_USER + 100) //这种定义方法没有测试,不知道行不行:static UINT WM_add_event_ok = RegisterWindowMes

从普通DLL中导出C++类 &lt;一&gt;

Microsoft Specific You can declare C++ classes with the dllimport or dllexport attribute. These forms imply that the entire class is imported or exported. Classes exported this way are called exportable classes.The following example defines an export

Android Handler类 发送消息-post()和postDelay(), Looper讲解

https://blog.csdn.net/weixin_41101173/article/details/79701832 首先,post和postDelay都是Handler的方法,用以在子线程中发送Runnable对象的方法: 其次,Android中post()方法可以直接在非UI线程中更新UI,不同与Handelr的Send类方法,需要进行切换: 最后,两个方法在实现UI线程事件的时间上有所区别,postDelayed()方法用以延期执行,post则是立即执行: (2)Handler类的

关于如何在MFC工程中输入不同的数据进行调试

我们可以采用c++的文件输入输出来进行调试 这样就绕过了不能使用黑窗口输入数据就不能调试的思维定式 不是黑窗口的我们都可以考虑用文件流输入输出 或者用控件来输入? http://blog.csdn.net/bichenggui/article/details/4600153