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")里. 文件管理器找不 ...
随机推荐
- TableLayout
- 开涛spring3(9.4) - Spring的事务 之 9.4 声明式事务
9.4 声明式事务 9.4.1 声明式事务概述 从上节编程式实现事务管理可以深刻体会到编程式事务的痛苦,即使通过代理配置方式也是不小的工作量. 本节将介绍声明式事务支持,使用该方式后最大的获益是简 ...
- php+ajax发起流程和审核流程(以请假为例)
上一篇随笔中已经提到如何新建流程,那么现在我们就来看一下如何发起一个流程和审核流程~~~ 先说一下思路: (1)登录用session获取到用户的id (2) 用户发起一个流程 注意:需要写申请事由 ( ...
- python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
预期框架整理目标: 1.单个用例维护在单个.py文件中可单个执行,也可批量生成组件批量执行 2.对定位参数,定位方法,业务功能脚本,用例脚本,用例批量执行脚本,常用常量进行分层独立,各自维护在单独的. ...
- zookeeper的安装与配置
本文将通过三个zookeeper的节点去配置 1.首先去官网下载zookeeper的包 zookeeper-3.4.10.tar.gz 2.用FTP文上传到/usr/local下 3.解压文件tar ...
- 安装lnmp集成环境
具体配置看原文,不重新复述: 原文:https://lnmp.org/install.html 因为配置数据库主从,需要保持两台mysql数据库服务器的mysql版本号一致,所以又重新装了一次..重新 ...
- 每天4亿行SQLite订单大数据测试(源码)
SQLite单表4亿订单,大数据测试 SQLite作为嵌入式数据库的翘楚,广受欢迎!新生命团队自2010年以来,投入大量精力对SQLite进行学习研究,成功应用于各系统非致命数据场合. SQLite极 ...
- nfs+rsync+inotify实现文件的实时同步
准备三台服务器进行测试: nfs_server:192.168.12.110 web_server:192.168.12.111 rsync_server:192.168.12.112 网络规划图: ...
- 每天一个JS 小demo之商品下架特效制作,主要知识点:定时器,倒计时,抖动特效。PS:由于不方便上传文件夹,只能上传效果图,图片等素材需自寻哟。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- JavaSE教程-04Java中循环语句for,while,do···while-练习2
1.编写一个剪子石头布对战小程序 该法是穷举法:将所有情况列出来 import java.util.*; public class Game{ public static void main(Stri ...