VB读写进程句柄-共享内存-内存映射CreateFileMapping

 

共享内存 其实就是 一个 句柄
可以用工具查看进程句柄 中就可以发现,类似 互斥体一样的东西
然后共享内存 ,创建的是一个句柄名称 "Global\{FD921876-60EB-4799-A084-872BEDB29151}")
不过这个东西在 用XT工具查看进程句柄的时候 发现 并没有 Global\ 这个字符串名,而是 

\BaseNamedObjects\{FD921876-60EB-4799-A084-872BEDB29151}


句柄类型          句柄名称
Section        \BaseNamedObjects\{FD921876-60EB-4799-A084-872BEDB29151}

vb6读取共享内存的代码如下:模块代码如下

Option Explicit
'
'通常使用CreateFileMapping建立共享内存时名称中没有加入 "Global\", 这使得共享的内存只能在当前用户下被另一个或多个进程访问, 例如:
'
'  CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("MyShare"));
'
'  当把程序放到服务器上并运行,然后用远程桌面连接服务器时的用户身份作为了另一用户,这时运行访问共享内存的程序将产生错误[代码是2]。根据错误代码认为是权限问题,通常会去添加安全描述符,也就是设置CreateFileMapping的LPSECURITY_ATTRIBUTES参数,会这样做:

'
'  Global\*** 可以保证:在创建命名时间对象时指定名字是全局的,使用全局名称创建的内核对象无论出于服务,还是内核中,应用层都可以打开并使用这个内核对象。
'
'  然后改为使用全局名称,用远程桌面登陆到服务器在不同的用户下就能够运行访问共享内存的程序了!
'
'  CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("Global\MyShare"));
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Public Const PAGE_READWRITE = &H4&
Public Const FILE_MAP_WRITE = &H2&
Public Const FILE_MAP_READ = &H4&
Public Const MEMPAGE = &HFFFFFFFF


Public Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public 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
Public Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As Any) As Long
Public Declare Function OpenFileMapping Lib "kernel32" Alias "OpenFileMappingA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Public Declare Function GetLastError Lib "kernel32" () As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


Public fMapHandle As Long
Public pFileMap As Long
Public Sub MyInitialize()

Dim TemSa As SECURITY_ATTRIBUTES
Dim TemLng As Long

TemSa.bInheritHandle = 1
TemSa.lpSecurityDescriptor = 0
TemSa.nLength = Len(TemSa)

fMapHandle = OpenFileMapping(FILE_MAP_READ, False, "Global\{FD921876-60EB-4799-A084-872BEDB29151}")
If fMapHandle = -1 Then
MsgBox "文件MAP失败!"
Exit Sub
End If
pFileMap = MapViewOfFile(fMapHandle, FILE_MAP_READ, 0, 0, 100)

'MsgBox fMapHandle
'MsgBox pFileMap

TemLng = GetLastError
If TemLng <> 0 Then
    MsgBox TemLng
End If

End Sub

Public Sub MyTerminate()

'释放对象
If pFileMap <> 0 Then
UnmapViewOfFile pFileMap
End If

If fMapHandle <> 0 Then
CloseHandle fMapHandle
End If

End Sub

Public Function GetOne() As Long
        
        Dim byt(9) As Byte
        Dim TemLng As Long
        
        CopyMemory byt(0), ByVal pFileMap, 8
        
        Dim i As Long, tem As String
        For i = 0 To 7
        tem = tem & VBA.Replace(Hex(byt(i)), "3", "")
        Next i
        GetOne = Val(tem)
End Function

窗体代码如下


Private Sub Command2_Click()
   Dim x As String
   x = GetOne
   MsgBox x
End Sub

Private Sub Form_Load()
   MyInitialize
End Sub


下面是 VB创建共享内存的代码

窗体代码如下

Private Sub Command1_Click()

   SetOne 1
End Sub

Private Sub Command2_Click()
   Dim x As Long
   x = GetOne
   MsgBox x
End Sub

Private Sub Form_Load()
   MyInitialize
End Sub

模块代码如下

Option Explicit

Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Public Const PAGE_READWRITE = &H4&
Public Const FILE_MAP_WRITE = &H2&
Public Const FILE_MAP_READ = &H4&
Public Const MEMPAGE = &HFFFFFFFF


Public Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public 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
Public Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As Any) As Long
Public Declare Function OpenFileMapping Lib "kernel32" Alias "OpenFileMappingA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Public Declare Function GetLastError Lib "kernel32" () As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public fMapHandle As Long
Public pFileMap As Long

Public Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ptr() As Any) As Long


Public Sub MyInitialize()

Dim TemSa As SECURITY_ATTRIBUTES
Dim TemLng As Long

TemSa.bInheritHandle = 1
TemSa.lpSecurityDescriptor = 0
TemSa.nLength = Len(TemSa)

fMapHandle = CreateFileMapping(MEMPAGE, TemSa, PAGE_READWRITE, 0, 1024, "Global\{FD921876-60EB-4799-A084-872BEDB29151}")  'FILE_MAP_READ
If fMapHandle = -1 Then
MsgBox "文件MAP失败!"
Exit Sub
End If
pFileMap = MapViewOfFile(fMapHandle, FILE_MAP_WRITE, 0, 0, 100)

'MsgBox fMapHandle
'MsgBox pFileMap

TemLng = GetLastError
If TemLng <> 0 Then
    MsgBox TemLng
End If

End Sub

Public Sub MyTerminate()

'释放对象
If pFileMap <> 0 Then
UnmapViewOfFile pFileMap
End If

If fMapHandle <> 0 Then
CloseHandle fMapHandle
End If

End Sub

Public Function SetOne(ByVal WhichData As Long) As Long
Dim byt(9) As Byte
byt(0) = &H31
byt(1) = &H32
byt(2) = &H33
byt(3) = &H34
byt(4) = &H35
byt(5) = &H36
byt(6) = &H37
byt(7) = &H38
CopyMemory ByVal pFileMap, byt(0), 8

End Function


Public Function SetOne1(ByRef WhichData As Variant) As Long

CopyMemory ByVal pFileMap, WhichData, 8

End Function


Public Function GetOne() As Long
Dim byt(9) As Byte
Dim TemLng As Long

CopyMemory byt(0), ByVal pFileMap, 8

Dim i As Long, tem As String
For i = 0 To 7
tem = tem & VBA.Replace(Hex(byt(i)), "3", "")
Next i
GetOne = Val(tem)

End Function
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侠客软件开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值