VB6之WM_COPYDATA
WM_COPYDATA消息是一种进程间通信的一种方式,参考文档如下:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(v=vs.85).aspx
http://www.flounder.com/wm_copydata.htm
http://support.microsoft.com/kb/176058
直接上代码,接收端:
'模块部分
'code by lichmama from cnblogs.com
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
Source As Any, ByVal Length As Long)
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long Private Const WM_COPYDATA = &H4A
Public Const GWL_WNDPROC = (-)
Private Type COPYDATASTRUCT
dwData As Long '数据标识
cbData As Long '数据长度
lpData As Long '数据地址
End Type
Public lpPrevWndFunc As Long Public Function CallbackWndProc(ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long If wMsg = WM_COPYDATA Then
Dim lpCDS As COPYDATASTRUCT
Dim buff() As Byte Call CopyMemory(lpCDS, ByVal lParam, Len(lpCDS))
ReDim buff(lpCDS.cbData) As Byte
Call CopyMemory(buff(), ByVal lpCDS.lpData, lpCDS.cbData)
Debug.Print "#WM_COPYDATA", "dwData:" & lpCDS.dwData, "cbData:" & lpCDS.cbData, "lpData:" & Left(buff, lpCDS.cbData)
Erase buff
End If
CallbackWndProc = CallWindowProc(lpPrevWndFunc, hWnd, wMsg, wParam, lParam)
End Function
'窗体部分
'code by lichmama from cnblogs.com
Private Sub Form_Load()
lpPrevWndFunc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
Call SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf CallbackWndProc)
Me.Hide
End Sub Private Sub Form_Unload(Cancel As Integer)
Call SetWindowLong(Me.hWnd, GWL_WNDPROC, lpPrevWndFunc)
End Sub
接下来是,发送端:
'code by lichmama from cnblogs.com
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long Private Const WM_COPYDATA = &H4A
Private Type COPYDATASTRUCT
dwData As Long '数据标识
cbData As Long '数据长度
lpData As Long '数据地址
End Type Private Sub Command1_Click()
Dim hWnd As Long
Dim lpCDS As COPYDATASTRUCT
Dim buff() As Byte
Dim msgId As Long hWnd = FindWindow(vbNullString, "Receiver")
buff = "你好,我是lichmama。"
'在COPYDATASTRUCT结构中,dwData是[接收端]用来区分不同数据用的。
' 因为,正常的数据交互中,程序要根据不同的数据做不同处理。
' 所以,就需要一个dwData这样的变量来做数据区分的标志。
' 但是,我建议你在给dwData赋值时,最好满足{dwData>=cbData}
lpCDS.cbData = UBound(buff) +
lpCDS.lpData = VarPtr(buff())
For msgId = To
lpCDS.dwData = msgId
Call SendMessage(hWnd, WM_COPYDATA, Me.hWnd, lpCDS)
Next
End Sub
接收端收到消息,处理后如下:
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
#WM_COPYDATA dwData: cbData: lpData:你好,我是lichmama。
VB6之WM_COPYDATA的更多相关文章
- VB6史无前例的子类化之透明按钮
[原创文章,转发请保留版权信息] 作者:mezstd 文章地址:http://www.cnblogs.com/imez/p/3299728.html 效果图: 请原谅笔者无耻地称之为史无前例,至少在笔 ...
- WM_COPYDATA实现的不同进程间通信
进程间通信,通过SendMessage向另一进程发送WM_COPYDATA消息,实现不同进程间的消息通信. 需求:已写好一个工具软件,想在不更改当前的软件开发的前提下,实现为后面新开发的软件提供数据推 ...
- VB6与VB.NET对照表
VB6与VB.NET对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1.It ...
- 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解
'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...
- VB6.0 和VB.NET 函数对比
VB6.0和VB.Net的对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1 ...
- MODI与VB6
作者:马健邮箱:stronghorse_mj@hotmail.com主页:http://www.comicer.com/stronghorse发布:2016.12.16 在我写的<用MODI O ...
- WM_COPYDATA进程间通信方案
连续在两个公司使用WM_COPYDATA实现进程间通信了,整理一下 具体步骤: 一. 进程A通过ShellExecute启动进程B, 将用于通信的窗口句柄hWndA(已强转为int值)通过命令行参 ...
- vb6保存项目到c盘的安装目录
工程保存在安装目录("C:\Program Files (x86)\Microsoft Visual Studio\VB98\errhandler1.vbp")里. 文件管理器找不 ...
随机推荐
- 解决Cornerstone不能上传.a文件的问题 Cornerstone不上传*.xcuserstate,*.xcbkptlist文件
在使用CornerStone的时候经常会出现.a文件无法上传的问题,导致从svn checkout到本地的时候编译报错 这里可以通过配置CornerStone来达到上传.a文件的效果 操作步骤: 打开 ...
- Memcached和Redis简介
前言: 目前比较流行的缓存技术无疑是Memcached和Redis,两套缓存技术有着诸多的相似之处,但又具备大量的显著差异,作为新生的方案,Redis被视为首选,但是有些场景Memcached发挥的作 ...
- XInput和DirectInput
原文链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx XInput是一个允许应用从W ...
- TCP--telnet为何在127s后返回?
背景 近期编写了监控业务服务器的脚本,主要原理是用shell脚本(运行shell的机器称之为监控机)调用项目组专用的接口测试工具,对指定的业务服务器进行业务操作,根据接口测试工具的返回结果判断业务服务 ...
- 你对SpringMvc是如何理解的?
SpringMVC工作原理 SpringMvc是基于过滤器对servlet进行了封装的一个框架,我们使用的时候就是在web.xml文件中配置DispatcherServlet类:SpringMvc工作 ...
- 移动端使用rem同时适应安卓ios手机原理解析,移动端响应式开发
rem单位大家可能已经很熟悉,rem是随着html的字体大小来显示代表宽度的方法,我们怎样进行移动端响应式开发呢 浏览器默认的字体大小为16px 及1rem 等于 16px 如果我们想要使1rem等于 ...
- INFORMATION_SCHEMA.PROFILING
24.18 The INFORMATION_SCHEMA PROFILING Table PROFILING表提供了语句分析信息. 其内容对应于SHOW PROFILES和SHOW PROFILE语句 ...
- Coursera 机器学习笔记(八)
主要为第十周内容:大规模机器学习.案例.总结 (一)随机梯度下降法 如果有一个大规模的训练集,普通的批量梯度下降法需要计算整个训练集的误差的平方和,如果学习方法需要迭代20次,这已经是非常大的计算代价 ...
- C#开发移动应用系列(1.环境搭建)
前言 是时候蹭一波热度了..咳咳..我什么都没说.. 其实也是有感而发,昨天看到Jesse写的博文(是时候开始用C#快速开发移动应用了),才幡然醒悟 , 原来我们的Xamarin已经如此的成熟了... ...
- css样式,边界和边框,格式和布局
1.大小:width:宽:heigh:高 2.背景:1)background-color:背景颜色 2)background-image:背景图片url路径 3)background-repeat:图 ...