`
mmdev
  • 浏览: 13451009 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

这是我在用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);
/// <summary>
/// 重载窗口函数
/// </summary>
/// <param name="m"></param>
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
);

分享到:
评论

相关推荐

    Collection-MFC.rar_MFC程序

    MFC通过消息映射机制将消息与成员函数关联,使得当特定的消息被发送到对象时,对应的成员函数会被调用。这简化了事件处理的编程过程。 4. **数据库支持** MFC提供了ODBC(Open Database Connectivity)类,如...

    用C#调用windowAPI做拾色器源码

    在C#中,我们通过定义具有指定属性的委托和结构来声明API函数和数据结构。 2. **创建拾色器**: Windows API中有一个名为`ChooseColor`的函数,用于弹出系统颜色选择对话框。在C#中,我们需要定义这个函数的委托类型...

    MFC类库详解中文版.zip

    6. **应用程序类(Application Classes)**:如CWinApp,每个MFC应用程序都有一个CWinApp实例,负责应用程序的初始化、消息循环以及退出清理。 7. **串行化支持(Serialization Support)**:通过继承CObject类,...

    C#联合halcon海康威视相机(缩放,平移)实现模板匹配,+ C#联合halcon打开海康威视相机(图像可缩放,平移)

    C#winform联合halcon海康威视相机(缩放,平移)实现模板匹配:实例化海康提供的类,获取图像,然后在halcon 中实现模板匹配。自己做一个test.shm模板存储在debug文档中,就可以实现模板匹配。 C#联合halcon打开...

    windows程序设计教程

    2. **消息队列与消息循环**:Windows程序中的事件驱动模型,如何通过消息队列接收和处理用户输入以及其他事件。 3. **窗口类与窗口过程**:创建窗口的步骤,窗口类的定义,以及窗口过程如何处理窗口消息。 4. **...

    Window下通过DirectShow控制USB摄像头抓拍照片

    滤镜之间通过连接器(Pin)传递数据。典型的捕获流程包括源滤镜(通常是设备驱动,如USB摄像头)、捕获滤镜、格式转换滤镜,以及文件写入滤镜。 要实现USB摄像头的抓拍功能,我们需要完成以下步骤: 1. **初始化...

    微软常用运行库合集-2020.03.25-x64.zip

    **VC++运行库** 是微软Visual C++开发环境生成的程序所必需的一部分,因为它们包含了C++标准库、MFC(Microsoft Foundation Classes)、ATL(Active Template Library)和其他与Windows API交互的组件。这些运行库...

    如何再VB,VC和.NET中使用halcon.dll

    例如,通过查看`open_window`函数的帮助文档来理解其正确用法。 #### VB 开发 虽然本文档未提供VB环境下的具体实现细节,但可以参考VC开发的部分。在VB环境下使用Halcon.dll主要涉及到添加引用、编写调用Halcon...

    Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法

    在Visual Studio中,根据不同的操作系统配置64位或32位DLL动态库文件的引用,是软件开发过程中常见的需求,尤其是在进行C#项目开发时,可能需要根据目标运行环境的不同(例如32位系统或64位系统)选择合适的库文件。...

    Visual c++中使用EnumForms的用法

    在Visual C++编程环境中,EnumForms是一个非常有用的API函数,主要应用于Windows Forms应用程序。这个函数允许程序员枚举或遍历当前进程中所有已创建的窗体(forms)。这在需要跨多个窗体进行操作或者需要获取应用...

    去掉WebBrowser的边框和滚动条

    1. 引用Win32 API库:在C#项目中,需要添加对`user32.dll`和`ole32.dll`的引用,以使用`SetWindowLong`和`CreateParams`等函数。 2. 定义常量:定义窗口风格常量,如WS_VISIBLE(使窗口可见)、WS_CHILD(子窗口)...

    Visual studio 2008的操作界面截图2

    - MFC(Microsoft Foundation Classes)程序: 使用 MFC 类库创建的应用程序。 **4. 项目属性窗口** 项目属性窗口允许开发者对项目的各种配置进行设置,包括编译选项、连接器设置等。通过点击“项目”-&gt;“属性”...

    opencv打开rtsp视频流并显示视频

    通过`waitKey`函数,我们可以检测用户输入,如按下Esc键退出程序。 要使此代码工作,你需要将`"rtsp://your_rtsp_stream_url"`替换为实际的RTSP流URL。注意,由于RTSP流可能需要认证或其他特定参数,你可能需要根据...

Global site tag (gtag.js) - Google Analytics