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的更多相关文章

  1. VB6史无前例的子类化之透明按钮

    [原创文章,转发请保留版权信息] 作者:mezstd 文章地址:http://www.cnblogs.com/imez/p/3299728.html 效果图: 请原谅笔者无耻地称之为史无前例,至少在笔 ...

  2. WM_COPYDATA实现的不同进程间通信

    进程间通信,通过SendMessage向另一进程发送WM_COPYDATA消息,实现不同进程间的消息通信. 需求:已写好一个工具软件,想在不更改当前的软件开发的前提下,实现为后面新开发的软件提供数据推 ...

  3. VB6与VB.NET对照表

    VB6与VB.NET对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1.It ...

  4. 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解

    '*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...

  5. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)

    VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...

  6. VB6.0 和VB.NET 函数对比

    VB6.0和VB.Net的对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1 ...

  7. MODI与VB6

    作者:马健邮箱:stronghorse_mj@hotmail.com主页:http://www.comicer.com/stronghorse发布:2016.12.16 在我写的<用MODI O ...

  8. WM_COPYDATA进程间通信方案

    连续在两个公司使用WM_COPYDATA实现进程间通信了,整理一下 具体步骤: 一.   进程A通过ShellExecute启动进程B, 将用于通信的窗口句柄hWndA(已强转为int值)通过命令行参 ...

  9. vb6保存项目到c盘的安装目录

    工程保存在安装目录("C:\Program Files (x86)\Microsoft Visual Studio\VB98\errhandler1.vbp")里. 文件管理器找不 ...

随机推荐

  1. iOS storyBoard中tableViewCell传值方法

    一般在storyboard中传值通过identifier的值来控制segue的跳转和传值,但是,如果在tableView中,由于cell特别多,不可能创建n个identifier标识符,这里通过NSI ...

  2. SmartCoder每日站立会议10

    站立会议内容: 准备为上交第一阶段项目进行加班,将各个页面联系起来,静态地图变为动态转换,考虑地图全屏或者是小屏即消息展示方式 1.站立会议照片:      2.任务展板: 3.燃尽图:

  3. sql备份文件兼容性问题

    第一步: 右键需要备份的数据库,选择"属性"

  4. Configure Always On Availability Group for SQL Server on RHEL——Red Hat Enterprise Linux上配置SQL Server Always On Availability Group

    下面简单介绍一下如何在Red Hat Enterprise Linux上一步一步创建一个SQL Server AG(Always On Availability Group),以及配置过程中遇到的坑的 ...

  5. Android搞事篇——使用Intent跳转界面

    跳转页面基本分为三个步骤: 1.初始化一个intent:(一个intent就够用了): 2.传入intent参数: 3.调用startactivity();实现跳转页面 具体操作如下 首先你需要一个项 ...

  6. C++ #if #endif #define #ifdef #ifndef #if defined #if !defined详解 (转)

    (源)http://blog.csdn.net/sky1203850702/article/details/42024673 首先,让我们先从头文件开始,在很多头文件里,我们会看到这样的语句 #ifn ...

  7. spring boot 入门操作(二)

    spring boot入门操作 使用FastJson解析json数据 pom dependencies里添加fastjson依赖 <dependency> <groupId>c ...

  8. Tenacity——Exception Retry 从此无比简单

    Python 装饰器装饰类中的方法这篇文章,使用了装饰器来捕获代码异常.这种方式可以让代码变得更加简洁和Pythonic. 在写代码的过程中,处理异常并重试是一个非常常见的需求.但是如何把捕获异常并重 ...

  9. 解决(防止)DDOS攻击的另一种思想

    本方案适合作最后的处理方案. 在服务器遭到DDOS攻击后,防火墙.高防盾或者其他的方案都已经失去了效力,这时运维人员无任何方案可以处理,并且只能任由DDOS攻击或关闭服务器时,该方案可以有限的抵挡大部 ...

  10. ORA-12638: 身份证明检索失败 解决方法

    用PL/SQL或Navicat连接本地或远程Oracle数据库的时候报错:ORA-12638: 身份证明检索失败 解决方法: 开始 -> 所有程序 -> Oracle - Oracle_h ...