VC.Net从DLL传递消息到EXE

Visual C++ 6.0编程实战:从MFC消息机制到Windows桌面开发核心原理 Windows桌面开发的核心在于理解底层消息循环与图形设备接口(GDI)等基础概念。消息映射机制作为Windows程序的事件驱动基础,通过将用户操作转化为系统消息并分发给对应处理函数,构成了GUI应用的交互骨架。GDI绘图原理则提供了图形渲染的底层支持,涉及设备上下文、坐标变换等关键技术。这些原理不仅是MFC框架的基石,更是现代Qt、WPF等GUI框架共同依赖的技术内核。掌握消息循环与GDI编程,能帮助开发者深入理解Windows桌面应用的运行机制,为维护遗留系统和学习现代框架打下坚实基础。本文通过Visu 阅读详情
进行DLL开发过程中,尤其在进行底层硬件开发过程中,比如实时接收数据,进程需要和应用程序进行交互,而DLL和应用程序最好的交互就是发消息了,在DLL中定义消息的方式和在应用程序中定义消息的方式非常相似。下面谈谈这两种定义的方法:

一、在应用程序自定义消息方法:

一般自定义消息有一定的范围,虽然说自定义消息从WM_USER开始,但是由于我们的工程里面一般还有很多其他的控件,他们也要占用一部分WM_USER消息范围,所以我们必须为他们留出一部分范围,这里,我们保留100个消息,一般情况下,这可以满足我们的要求。

(1)定义消息的值。在我们要发生消息的地方(例如CMyView.cpp的开始部分)或者stdafx..h文件,进行如下定义:

#define WM_MSG(WM_USER+101)

接下来的工作其实很简单,我们在前面说了,消息正常工作有3个部分必须协调:消息声明、消息映射、消息体。我们就一次进行手工加入。

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

 protected:

// {{AFX_MSG(CMyView)

......

afx_msg LRESULT OnMyMsg(WPARAM wParam,LPARAM lParam);

file&://}}AFX_MSG

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

 BEGIN_MESSAGE_MAP(CMyView, CView)

file&://{{AFX_MSG_MAP(CMyView)

 .....

ON_MESSAGE(WM_MSG, OnMyMsg)

 file&://}}AFX_MSG_MAP

 END_MESSAGE_MAP()

(4)添加消息函数体:

LPESULT CMyView::OnMyMsg(WPARAM wParam, LPARAM lParam)

{

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

 return 0;

}

消息至此就已经定义完毕,接下来我们就可以激活消息了,就可以用我们前面所说的PostMessage/SendMessage来发送消息了。

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

 PostMessage:不用等消息返回。

    SendMessage:需要等消息返回。

    

二、从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);

}

运行应用程序,可以看到测试结果:




程序源码:MessageDLL.rar(http://www.51pub.net/class/classlibrary/20046984317374.rar)
VC++消息映射机制深度解析:从Windows消息泵到MFC实战避坑指南 消息驱动架构是Windows GUI编程的核心基础,其原理基于操作系统生成消息、应用程序通过消息泵循环获取并分派消息到窗口过程。这一机制构成了所有Windows桌面应用的运行基石,其技术价值在于实现用户输入与程序逻辑的解耦,支撑了响应式交互体验。在MFC框架中,消息映射表通过静态数据结构将消息ID与处理函数关联,替代了原始的switch-case处理方式,大幅提升了开发效率。然而,在维护遗留系统或进行混合开发时,开发者常面临消息路由失效、线程安全等工程挑战。本文聚焦VC++消息映射,深入剖析CWnd::Wi 阅读详情

相关推荐

ScottPlot与DLL那些坑:加载原理、报错排查与跨语言封装实战

在Windows桌面开发中,DLL动态链接库的加载机制往往决定了程序能否稳定运行。从系统搜索顺序到依赖链解析,任何一环缺失都会引发DllNotFoundException或BadImageFormatException。ScottPlot作为高性能.NET图表库,凭借其简单的API和卓越的渲染性能,深受WinForms与WPF开发者青睐。然而,其依赖的原生SkiaSharp组件以及多版本共存问题,让开发者频频踩坑。理解非托管DLL的位数匹配、运行时初始化失败以及跨语言封装原理,是解决这些问题的关键。通过C接

weixin_32430941的博客 290

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

      这是我在用C#开发IOServer遇到的一个问题,该程序需要用到原先用MFC开发的DLL,最大问题是该dll运行过程中的一些信息,通过window消息向指定的hwnd(窗体句柄)发送数据。数据的指针放在WParam参数里,LParam参数是数据的类型信息。     C#提供  m.GetLParam()函数,可惜我的数据放在WParam参数里(这个还不能修改,否则原有程序就无法运行

刘洪峰AIoT | 一叶启帆·万物智联 6035

VC6开发的SolidWorks插件源码:输入参数自动生成零件、装配体和工程图

这个资源包提供一套完整的VC6环境下开发的SolidWorks C++插件源代码,支持在SolidWorks 2001–2005等早期版本中运行。核心功能包括通过对话框输入尺寸参数,自动驱动零件建模、装配体构建及关联工程图更新。代码结构清晰,包含标准应用程序框架、SolidWorks COM接口调用封装(sldworks_i.c、SldWorks.h/.cpp)、文档/视图类(TestAsmDoc/TestAsmView)、资源文件(图标、对话框、菜单)以及完整项目配置(.dsw/.dsp)。所有关键逻辑配

qsc90123456的博客 283

在C#应用程序与DLL交互中使用消息

在C#是一种类似 Java 的完全面向对象的高级编程语言,其处理过程采用事件驱动方式,但在实际的使用过程中,有时候通过调用系统原有的消息处理起来会更简单,特别是在处理与DLL文件的交互时,实践证明的确是非常方便的。 在C#中使用自定义消息  在C#中使用自定义消息非常简单,只需要下面几个简单的步骤就可以了:  1、定义消息  定义消息的方法与在VC中定义消息有一点点不同,比如在VC中申明一个自定义...

weixin_34198762的博客 165

EXE和DLL间的消息传递

这是通过窗体消息循环的机制在EXE和DLL之间进行消息传递的例子。 当frm_EXE的尺寸发生变化时将特定消息传递给frm_DLL使其尺寸也发生变化。

RV1126B芯片实战:如何用这款视觉处理器SoC打造你的第一个AI摄像头项目

本文详细介绍了如何利用瑞芯微RV1126B视觉处理器SoC从零构建AI摄像头项目。涵盖硬件选型、开发环境搭建、ISP配置、AI模型部署及系统集成等关键步骤,帮助开发者高效实现边缘计算方案,特别适合智能安防和工业检测应用。

dropout6artist的博客 932

VC++.NET中定义和使用MFC DLL

什么是DLL?  DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库。DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。  在下面我们将通过一个具

660

AMSR-2数据下载实战:从JAXA到LPRM的算法选择与效率优化

本文详细介绍了AMSR-2数据的下载实战,重点对比了JAXA与LPRM算法的差异及适用场景,并提供了高效下载方案和网络优化策略。通过实际案例和代码示例,帮助用户快速获取和处理AMSR-2数据,提升研究效率。

rl6adventurer的博客 692

在C#里面调用带有回调函数和自定义结构体的DLL的例程——转载

开发环境:    WinXP Pro(SP2英文版) + VS.NET 2003中文版接口库版本:  CMPP2.0 API第二版(V2.6)    该例程演示了如何在C#里面调用VC6.0开发的带回调函数的API,而且回调函数的参数包含结构体,使用C#的委托和IntPtr方法实现.    CMPP2.0的API封装成了标准C调用的方法,提供以下三个接口,使用的时候只要有CMPPAPI.dll就可

烟沉往逝 2461

华为/H3C/锐捷交换机配置命令对比表:一张图搞定VLAN划分与端口设置

本文详细对比了华为、H3C、锐捷三大品牌交换机在VLAN划分与端口设置中的配置命令差异,提供从基础配置到高级功能的横向对比表,帮助网络工程师快速掌握多品牌设备混用环境下的配置技巧,提升工作效率。

rust6ferris的博客 701

第1关:STL模板之queue实例一:最少个数

头歌自创答案

xiyunSacire的博客 819

windows 编译版本异常处理

今天在编译一个Windows Form程序时.突然发现一个问题.在本机开发环境[X64位]能够很好调用.等打包安装后放到32位机器是突然发现提示一个错误如下: 具体异常信息如下: 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾。 ************** 异常文本 ************** System.DllNot...

weixin_34221276的博客 306

手把手搭建你的第一个OCT仿真模型:用Python和光学仿真库重现A-SCAN信号

本文详细介绍了如何使用Python和光学仿真库搭建OCT仿真模型,重现A-SCAN信号。从环境配置、干涉仪建模到信号处理全流程,手把手教你实现光学相干层析成像的核心技术。通过代码示例和性能优化技巧,帮助开发者深入理解OCT原理并应用于医疗诊断等领域。

weixin_42562079的博客 241

VC6 150个案例实战:从MFC到现代Windows开发的技能迁移与底层原理精解

Windows桌面应用开发的核心在于理解操作系统底层机制与图形用户界面框架。从Win32 API到MFC,其原理基于消息驱动与C++对象封装,为构建稳定、高效的本地应用程序提供了基础。掌握这些底层技术价值在于能够深入理解现代GUI框架(如Qt、WPF)的封装逻辑,并具备维护和现代化改造遗留系统的能力。在应用场景上,这涵盖了从工具软件、数据管理程序到嵌入式界面等广泛领域。本文聚焦于通过解析经典的Visual C++ 6.0应用案例,系统拆解MFC框架下的界面编程、文档视图架构、文件系统操作等核心模块,旨在帮助

weixin_34130389的博客 463

【Simulink教程案例18】基于simulink的基础OFDM+64QAM发射接收链路仿真

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的。

FPGA/MATLAB学习教程/源码/项目合作开发 1990

量子化学仿真软件:NWChem_(3).安装与配置NWChem

配置自定义BLAS库路径# 配置自定义LAPACK库路径# 配置自定义FFTW库路径# 配置自定义C编译器# 配置自定义Fortran编译器# 配置自定义MPI C编译器# 配置自定义MPI Fortran编译器通过以上步骤,您可以成功安装和配置NWChem,为后续的量子化学仿真计算打下坚实的基础。如果您在安装过程中遇到任何问题,可以参考NWChem的官方文档或社区论坛,获取更多的帮助和支持。

kkchenjj的博客 1291

CppSharp实战:自动化生成C++库的.NET绑定,实现跨语言无缝互操作

在软件工程中,跨语言互操作是整合不同技术栈、复用高性能库的关键需求。其核心原理是通过类型映射与内存管理,在运行时或编译时建立不同语言间的通信桥梁。传统方案如P/Invoke或C++/CLI往往面临手动映射繁琐、平台兼容性差与内存管理复杂等技术挑战。CppSharp作为一种编译时绑定生成器,通过解析C++头文件(AST)并自动生成类型安全、符合.NET习惯的托管代码,提供了更优的解决方案。它基于Clang/LLVM实现高精度解析,支持跨平台部署,并能通过自定义Pass灵活处理复杂类型映射。在应用场景上,Cpp

weixin_30824599的博客 362

YOLOv11 Neck革新:当SDI遇上BiFPN,带你打造精度飙升的特征融合网络

对于科研:这是一个新颖的特征融合思路,能做出差异化的实验,发论文、做项目都很有价值;对于工程:它能解决小目标漏检、大目标定位不准的痛点,让你的检测系统在工业质检、智能安防等场景下更可靠;对于技术成长:掌握了SDI和BiFPN的设计逻辑,你再去看其他特征融合方法(比如FPN、PAN),会有“一通百通”的感觉,以后优化任何检测模型都能举一反三。如果你之前在目标检测的精度上遇到了瓶颈,不妨试试SDI+BiFPN——它就像给YOLOv11装上了“透视眼”,让模型能看清每一个细节。

FJN110的博客 303
上一篇: 通过向父亲窗口发送消息,要求其他窗口对其进行销毁
下一篇: Win9x下程序间的数据传递
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值