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. oracle数据库常用的99条查询语句(转载)

    1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...

  2. 快速找到ARP病毒源

    第一招:使用Sniffer抓包 在网络内任意一台主机上运行抓包软件,捕获所有到达本机的数据包.如果发现有某个IP不断发送请求包,那么这台电脑一般就是病毒源.原理:无论何种ARP病毒变种,行为方式有两种 ...

  3. zookeeper的安装与配置

    本文将通过三个zookeeper的节点去配置 1.首先去官网下载zookeeper的包 zookeeper-3.4.10.tar.gz 2.用FTP文上传到/usr/local下 3.解压文件tar ...

  4. javascript基础-事件1

    原理 事件分两种.第一种浏览器事件,由浏览器抛出事件,它是人机交互的基础:第二种自定义事件,由程序员抛出事件,它是模拟事件流程.两者都是为了完成数据的传递. 浏览器事件 机制 冒泡和捕获两种机制.因I ...

  5. python unittest 测试笔记(一)

    测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试失败. python 单元测试官方文档: [Python: 2.7] (https://docs.python.or ...

  6. 学习Spark——那些让你精疲力尽的坑

    这一个月我都干了些什么-- 工作上,还是一如既往的写bug并不亦乐乎的修bug.学习上,最近看了一些非专业书籍,时常在公众号(JackieZheng)上写点小感悟,我刚稍稍瞄了下,最近五篇居然都跟技术 ...

  7. 腾讯AlloyTeam正式发布omi-cli脚手架 v1.0 - 创建网站无需任何配置

    omi-cli omi-cli omi-cli命令 omi框架 用户指南 文件目录 npm 脚本 npm start npm run dist 代码分割 兼容 IE8 插入 CSS 插入组件局部 CS ...

  8. jQuery UI 入门之实用实例

    jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...

  9. 你真的知道组件中的v-model吗?

    v-model的神奇 html <div id="app"> <input v-model="poin"> {{ poin }} < ...

  10. C#从基于FTPS的FTP server下载数据 (FtpWebRequest 的使用)SSL 加密

    FTPS,亦或是FTPES, 是FTP协议的一种扩展,用于对TLS和SSL协议的支持. 本文讲述了如何从一个基于FTPS的Server中下载数据的实例.   任何地方,如有纰漏,欢迎诸位道友指教.   ...