DLL(MFC)通过Window消息向C#程序传递数据

简介:

这是我在用C#开发IOServer遇到的一个问题,该程序需要用到原先用MFC开发的DLL,最大问题是该dll运行过程中的一些信息,通过window消息向指定的hwnd(窗体句柄)发送数据。数据的指针放在WParam参数里,LParam参数是数据的类型信息。

     C#提供  m.GetLParam()函数,可惜我的数据放在WParam参数里(这个还不能修改,否则原有程序就无法运行了,修改的代价太高),所以这个函数不能用。

    下面经过多次测试,终于获取数据成功。

   MFC DLL中的相关代码:

  

 
  1. TCHAR cMessage[255];  
  2.  SYSTEMTIME stime;  
  3.     GetLocalTime(&stime);  
  4.   swprintf(cMessage,_T("%04d-%02d-%02d %02d:%02d:%02d [%-16s #%03d] - %s "),stime.wYear,stime.wMonth,stime.wDay,stime.wHour,stime.wMinute,stime.wSecond,strSource,lngNO,strMessage);  
  5.        if (G_IOMRun.lngMsgFlag==0)  
  6.  {  
  7.      SendMessage(G_IOMRun.Hwnd, WM_USER+7722,(long)cMessage,lngType); //  
  8.  }  

  在C#中需要重载窗体的消息处理函数,相关代码如下:

     

 
  1. [DllImport("kernel32", EntryPoint = "CopyMemory")]  
  2.         public static extern void CopyMemory(StringBuilder Destination,IntPtr Source,int Length);  
  3.         /// <summary>  
  4.         /// 重载窗口函数  
  5.         /// </summary>  
  6.         /// <param name="m"></param>  
  7.         protected override void WndProc(ref Message m)  
  8.         {  
  9.             //---------------------  
  10.             if(m.Msg == 0x0400 + 7722)  
  11.             {                
  12.                StringBuilder strData = new StringBuilder(255);  
  13.                CopyMemory(strData, m.WParam, 255);  
  14.                ShowInfo((int)m.LParam,strData.ToString());  
  15.             }  
  16.             //---------------------  
  17.             base.WndProc(ref m);  
  18.         }  

注意:CopyMemory函数的声明需要自己修改(原声明如下),一定要去掉“ref” 关键字,否则会获取不正确。

 

 
  1. [DllImport("kernel32", EntryPoint="CopyMemory")]  
  2. public static extern void CopyMemory (  
  3.         ref int Destination,  
  4.         ref int Source,  
  5.         int Length  
  6. );  
  7.  

 














本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323436,如需转载请自行联系原作者

相关文章
|
存储 数据采集 XML
再谈主数据管理|一文读懂主数据项目实施
主数据管理是企业改善其关键数据资产(如产品数据,资产数据,客户数据,位置数据等)的一致性和质量的必要数据管理活动。
|
机器学习/深度学习 算法 数据挖掘
交叉验证之KFold和StratifiedKFold的使用(附案例实战)
交叉验证之KFold和StratifiedKFold的使用(附案例实战)
2379 0
|
7月前
|
移动开发 JavaScript 前端开发
《抉择与权衡:Vue技术栈下uni-app与Taro的跨端较量》
在Vue技术栈为主的团队中,选择跨端开发框架时,uni-app与Taro各有优势。uni-app基于Vue.js,语法熟悉度高,开发效率快,HBuilderX工具支持强,跨端覆盖广(iOS、Android、Web及多小程序平台),性能优化特性丰富,生态插件完善。而Taro虽支持Vue语法,但核心仍带React风格,需适应新思维,其性能在React Native和H5上表现突出,适合对这些平台有高性能需求的项目。团队应根据开发效率、跨端需求及性能要求权衡选择。
445 30
|
5月前
|
Python
Python中的循环可以嵌套使用吗?
Python中的循环可以嵌套使用吗?
339 57
|
缓存 负载均衡 算法
Java性能优化实战:从代码到部署的全方位攻略
在软件开发的世界里,性能是金。本文将通过浅显易懂的语言和具体案例,带你了解如何从编写更高效的Java代码开始,到利用JVM调优工具,再到部署环境的精细调整,全面提升你的Java应用性能。你将学会如何识别瓶颈、选择正确的数据结构和算法、进行垃圾回收调优,以及使用现代硬件优势来加速你的应用。无论你是新手还是资深开发者,这篇文章都将为你的Java性能优化之旅提供宝贵的指导。
|
安全 数据安全/隐私保护
【GitHub】2FA认证(双重身份验证)
【GitHub】2FA认证(双重身份验证)
2011 6
|
PyTorch 算法框架/工具 Python
pytorch保存参数及模型的两种方式
pytorch保存参数及模型的两种方式
928 0
PyQt5精简正则表达式测试小工具
PyQt5精简正则表达式测试小工具,本人自制的小APP。希望大家多多推荐哦!
1703 0