www.pudn.com > VBSendText.zip > ShareStr2.cls
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "CSharedString2"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
'***********************************************************************
'Class Module Name: CShareString
'Refactored by AdamBear 2002-1-31 22:00
'Originally Created By Bruce Meckinney, HardCore Visual Basic
'Purpose: Demostrate the FileMapping and Inter-Process Community
'************************************************************************
Private Const ERROR_ALREADY_EXISTS = 183&
Private Const ERROR_BAD_ARGUMENTS = 160&
Private Const ERROR_INVALID_DATA = 13&
Private Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As Any, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) 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 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
Private Declare Sub CopyMemoryToStr Lib "kernel32" Alias "RtlMoveMemory" (ByVal strDst As String, pScr As Long, ByVal length As Long)
Private Declare Sub CopyMemoryStr Lib "kernel32" Alias "RtlMoveMemory" (strDst As Long, ByVal pScr As String, ByVal length As Long)
Private Const PAGE_READWRITE = 4
Private Const FILE_MAP_WRITE = 2
Private h As Long '内存映射句柄
Private p As Long '映射视图指针
Sub Create(strName As String)
Dim e As Long
If strName = "" Then ApiRaise ERROR_BAD_ARGUMENTS
' 尝试建立一个大小为64K内存文件映射,不要怕设得大了,因为使用时是按4K为单位分配的。
h = CreateFileMapping(-1, ByVal pNull, PAGE_READWRITE, _
0, 65535, strName)
'保存错误描述,因其不一定真是错误,此处可能是正常的文件已存在信息,
' 具体可参见CreateFileMapping的帮助文件
e = Err.LastDllError
If h = 0 Then ApiRaise e '当然对CreateFileMapping这API,我们可以认为返回0才是错误。
' 取得映射文件的视图指针p,它指向就是从共享内存文件中映射来的进程可用的内存。
p = MapViewOfFile(h, FILE_MAP_WRITE, 0, 0, 0)
If p = pNull Then
CloseHandle h '一定要注意
ApiRaise Err.LastDllError
End If
'
If e <> ERROR_ALREADY_EXISTS Then
'HACK BSTR 保存p的前四个字节作为BSTR的长度存放处。
CopyMemory ByVal p, 0, 4
Else
'返回的是已经存在的FileMapping的句柄,不是错误
End If
End Sub
Private Sub Class_Terminate()
'清理
UnmapViewOfFile p
CloseHandle h
End Sub
'NOTE:为了让本类能做为String类型处理,须将本过程属性设为缺省。
Property Get item() As String
Attribute item.VB_UserMemId = 0
'此处Bruce MecKinney原来的代码存在极大的错误,对于Unicode的处理有问题
If h = 0 Then ErrRaise ERROR_INVALID_DATA
BugAssert p <> pNull
Dim c As Long
CopyMemory c, ByVal p, 4
If c Then
' 用内存指针p第四个字节以后的东西构造返回的BSTR
item = String$(c, 0)
CopyMemoryToStr item, ByVal (p + 4), c * 2
End If
End Property
Property Let item(s As String)
If h = 0 Then ErrRaise ERROR_INVALID_DATA
BugAssert p <> pNull
Dim c As Long, cb As Long
c = Len(s)
' 重新将BSTR放回内存中
CopyMemory ByVal p, c, 4
CopyMemoryStr ByVal (p + 4), s, c * 2
End Property
'
'
Private Sub ErrRaise(e As Long)
Dim sSource As String
If e > 1000 Then
sSource = App.EXEName & ".SharedString"
Err.Raise COMError(e), sSource
Else
sSource = App.EXEName & ".VBError"
Err.Raise e, sSource
End If
End Sub