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

news/2024/7/8 11:13:10

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

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

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

   MFC DLL中的相关代码:

   TCHAR cMessage[255];
  SYSTEMTIME stime;
     GetLocalTime(&stime);
   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);
        if (G_IOMRun.lngMsgFlag==0)
  {
      SendMessage(G_IOMRun.Hwnd, WM_USER+7722,(long)cMessage,lngType); //
  }

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

      [DllImport("kernel32", EntryPoint = "CopyMemory")]
        public static extern void CopyMemory(StringBuilder Destination,IntPtr Source,int Length);
        ///


        /// 重载窗口函数
        ///

        ///
        protected override void WndProc(ref Message m)
        {
            //---------------------
            if(m.Msg == 0x0400 + 7722)
            {             
               StringBuilder strData = new StringBuilder(255);
               CopyMemory(strData, m.WParam, 255);
               ShowInfo((int)m.LParam,strData.ToString());
            }
            //---------------------
            base.WndProc(ref m);
        }

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

[DllImport("kernel32", EntryPoint="CopyMemory")]
public static extern void CopyMemory (
        ref int Destination,
        ref int Source,
        int Length
);

 

 





http://www.niftyadmin.cn/n/3655754.html

相关文章

Promise catch() all() Race()

catch() .catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。 Promise 对象状态变为resolved,则会调用then()方法指定的回调函数;如果异步操作抛出错误,状态就会变为reje…

同样指令bmp.LockBits不同平台(Windows/WinCE)获取位图的数据不同

最近做了一个获取位图(24位位图)数据的程序,代码如下:Bitmap bmp newBitmap(BmpFile); //获取位图的数据 System.Drawing.Imaging.BitmapData bmpData bmp.LockBits(newRectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.…

用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)

以前的IOServer 是用VB6开发,驱动的配置方式和一般的组态软件没有什么很大的区别,配置起来比较麻烦,对一般的生手来说,要费一番功夫才能配置完毕。总觉得原有的程序和目前的HMI图元配置环境格格不入,所以重新编写了驱动…

如何用C#显示竖排文字?

看这个题目,应该觉的这个问题不难,刚开始我也是这么想,可是目前我手头上的参考资料上没有一个介绍竖直显示文字的,上网查资料只发现一个有用的,可是实现起来比较麻烦,需要进行坐标转换,旋转&…

.net精简框架集(WinCE平台下),XML反序列化成功与否与时间相关

在WinCE 4.2(.net精简框架集 2.0) 下反序列化一个XML文件,发现反序列化成功与否和时间相关。装有WinCE平台的触摸屏由于电池的原因,时间丢了,初始化时间为,1570年月日。此时反序列化提示XML文件有问题,序列化失败 。后…

如何让不支持遍历的数据可遍历

let authors {allAuthors:{fiction:["周","吴","郑"],scienceFiction:["王赵","钱孙","冯陈"],fantasy:["蒋沈韩杨","朱秦尤许","何吕施张"]},addres:[]}authors[Symbol.iterator…

嵌入式组态环境升级及XML反序列化慢的困惑

嵌入式组态开发比较顺利,V1.0α版本已经推出,再过几天应该推出V1.0β了。但是目前该组态有一个很大的问题,就是XML反序列化较慢,在上位机(PC)不是很明显,大约1~3秒就可以反序列化完毕…

3.7打卡 iincludes数组查询math.pow简写** 和promise语法糖async/await

1, includes 对数组进行查询 返回结果 true / false 2. Math.pow(4, 3); 数值,表示 x 的 y 次幂 (xy) 的值。 简写 ** 两个星号 比promise 跟优雅的异步方式 async function firstAsync(){let promise new Promise((resolve, reject) > {setTimeout(function …