如何在两个程序之间传递消息?共享内存如何使用?

newyj 2003-05-09 09:48:03
如何在两个程序之间传递消息?共享内存如何使用?
...全文
205 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
极速小王子 2003-05-10
  • 打赏
  • 举报
回复
控件的过程里面有!我忘记了
xfyxq 2003-05-10
  • 打赏
  • 举报
回复
给你一个内存共享的类模块:(FileMap)
Option Explicit
'#Const Sampling = True '编译常数Sampling=Ture:采样, =False:管理
Private DiskFileName As String '实时样本磁盘文件名
Private MapFileName As String '前者的(内存)映射文件名
Private FileHandle As Long '磁盘文件句柄
Private MapHandle As Long '映射文件句柄
Private MapAddress As Long '映射地址
Public LenBuffer As Long '缓冲区长度

Private Const FILE_MAP_WRITE = &H2
Private Const FILE_MAP_READ = &H4
Private Const PAGE_READWRITE = 4&
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const CREATE_ALWAYS = 2
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FILE_ATTRIBUTE_NORMAL = &H80

Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (DesStr As Any, SrcStr As Any, ByVal MaxLen As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function FlushFileBuffers Lib "kernel32" (ByVal hFile As Long) As Long
Private Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, ByVal lpFileMappingAttributes As Long, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
Private Declare Function OpenFileMapping Lib "kernel32" Alias "OpenFileMappingA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function MapViewOfFile Lib "kernel32" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
Private Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As Any) As Long

Private Sub InitVar()
MapFileName = "SampleMap"
LenBuffer = 10
FileHandle = 0
MapHandle = 0
MapAddress = 0
End Sub 'InitVar

Public Sub CopyToMap(S As String)
If MapAddress <> 0 Then
Call lstrcpyn(ByVal MapAddress, ByVal S, LenB(S) + 1)
End If
End Sub

Public Function GetFromMap(Optional LenS As Long) As String
Dim U_s As String
If LenS <= 0 Then LenS = LenBuffer
U_s = Space(LenS)
If MapAddress <> 0 Then
Call lstrcpyn(ByVal U_s, ByVal MapAddress, LenS + 1)
End If
GetFromMap = Trim(U_s)
End Function

Public Sub CloseMap()
If MapAddress <> 0 Then
Call UnmapViewOfFile(ByVal MapAddress)
MapAddress = 0
End If
If MapHandle <> 0 Then
Call CloseHandle(MapHandle)
MapHandle = 0
End If
If FileHandle <> 0 Then
Call CloseHandle(FileHandle)
FileHandle = 0
End If
End Sub 'CloseMap

Public Sub CreateMap(ByVal MapName As String)
Dim w As Long
MapFileName = MapName
MapHandle = CreateFileMapping(&HFFFFFFFF, 0, PAGE_READWRITE, 0, LenBuffer, MapFileName)
MapAddress = MapViewOfFile(MapHandle, FILE_MAP_WRITE, 0, 0, 0)
End Sub 'CreateMap

Public Function OpenMap(ByVal MapName As String) As Long
MapFileName = MapName
'Call InitVar
OpenMap = 0
MapHandle = OpenFileMapping(FILE_MAP_WRITE, False, MapFileName)
If MapHandle = 0 Then Exit Function
MapAddress = MapViewOfFile(MapHandle, FILE_MAP_WRITE, 0, 0, 0)
If MapAddress = 0 Then
Call CloseHandle(MapHandle)
MapHandle = 0
End If
OpenMap = MapAddress
End Function 'OpenMap

Private Sub Class_Initialize()
Call InitVar
End Sub

Private Sub Class_Terminate()
CloseMap
End Sub

-------------------------------------
使用方法: 1-建立映射
-------------------------------------

Public Map As FileMap
Set Map = New FileMap
Map.LenBuffer = 254 '内存空间大小(B)
Map.CreateMap "JianKong" '建立映射
Map.CopyToMap "AABBCCDD" '数据写入内存

-------------------------------------
2-打开映射
-------------------------------------
Public Map1 As FileMap
Set Map1 = New FileMap
Map1.OpenMap "JianKong" '打开映射
MsgBox(Map.GetFromMap) '读出数据


消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递消息排队模型,它可以在分布式环境下扩展进程间的通信。消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用更进一步的原因。在了解消息中间件之前,首先了解两个基本概念Message和Queue。Message :消息消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。队列的主要目的是提供路由并保证消息传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。消息队列的主要特点是异步处理,主要目的是减少请求响应时间和解耦。所以主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时由于使用消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。这也是消息中间件的意义所在。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧