刚开始接触vb。net,求助一个变量地址问题

一如既往哈 2010-12-28 12:26:23
有一段进程间通讯的代码--使用copydata


..............

Public Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Public Sub mySub(lParam As Long, wParam As Long)
On Error Resume Next
Dim cds As COPYDATASTRUCT
Dim w1 As String, n As Long
Dim Byt() As Byte
Call CopyMemory(cds, ByVal lParam, Len(cds))'''''这一句在vb.net中如何更改??
Select Case cds.dwData
Case 1
Case 2
Case 3 '
'重定义数组大小
ReDim Byt(wParam - 1)
Call CopyMemory(Byt(0), ByVal cds.lpData, cds.cbData)''''这一句在vb.net中如何更改??
w1 = StrConv(Byt, vbUnicode)
w1 = Left$(w1, InStr(1, w1, Chr$(0)) - 1)
n = InStr(w1, "|")
' Form1.Text3.Text = Right(w1, Len(w1) - n)
bFromHwnd = CLng(Left$(w1, n - 1))
' Form1.Lab1.Caption = "From:" & bFromHwnd
' Form1.Lab.Caption = "Size:" & wParam
End Select
End Sub

上述代码中的2句copymemory应该如何修改才能在vb.net中使用啊????

恳请大侠们指点一下。。。。。
...全文
229 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2010-12-28
  • 打赏
  • 举报
回复
不过,仔细看你的代码之后,我觉得不需要RtlMoveMemory。
应该就是Byte() -> Structure, Structure -> Byte()的过程。
还是放弃这种不安全的操作比较好。这也是.NET取消LSet行为的目的。
机器人 2010-12-28
  • 打赏
  • 举报
回复
参考:


Imports System.Runtime.InteropServices

Public Module LSetTest

Public Structure STRC_B
Private Declare Ansi Sub RtlMoveMemory Lib "kernel32" _
(ByVal Destination As String, ByRef Source As STRC_B, ByVal Length As Integer)

<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=3), VBFixedArray(3)> _
Public strBuff() As Char

Public Property Text() As String
Get
Dim intSize As Integer = Marshal.SizeOf(Me)
Text = Space(intSize)
RtlMoveMemory(Text, Me, intSize)
End Get
Set(ByVal value As String)

End Set
End Property
End Structure


<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Public Structure STRC_A

Private Declare Ansi Sub RtlMoveMemory Lib "kernel32" _
(ByVal Destination As String, ByRef Source As STRC_A, ByVal Length As Integer)

<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=4), VBFixedArray(4)> _
Public strA() As Char
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=4), VBFixedArray(4)> _
Public strB() As Char
<MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=4), VBFixedArray(4)> _
Public strC() As Char

'Embeded Structure in STRC_A
Public buff As STRC_B

Public Property Text() As String
Get
Dim intSize As Integer = Marshal.SizeOf(Me)
Text = Space(intSize)
RtlMoveMemory(Text, Me, intSize)
End Get
Set(ByVal value As String)
End Set
End Property

End Structure

Sub Main()
Dim abc As STRC_A = New STRC_A
abc.strA = "A___"
abc.strB = Space(4)
abc.strC = "B___"
abc.buff.strBuff = "123"
Console.WriteLine(abc.Text)
Console.Read()
End Sub

End Module
机器人 2010-12-28
  • 打赏
  • 举报
回复
看你的代码是实现SendMessage进程消息传递的代码,直接用下面的代码就可以了。


C#
http://www.chenjiliang.com/Article/View.aspx?ArticleID=3496

VB.NET:
http://www.lob.cn/jq/kfjq/1225.shtml
xingyuebuyu 2010-12-28
  • 打赏
  • 举报
回复
CopyMemoryByte (Byt(0),cds.lpData, cds.cbData)''''这一句在vb.net中如何更改??
xingyuebuyu 2010-12-28
  • 打赏
  • 举报
回复
Public Declare Sub CopyMemoryStruct Lib "kernel32" Alias "RtlMoveMemory" (Byref hpvDest As COPYDATASTRUCT, Byval hpvSource As Integer, ByVal cbCopy As Integer)

Public Declare Sub CopyMemoryByte Lib "kernel32" Alias "RtlMoveMemory" (Byref hpvDest As Byte, Byval hpvSource As Integer, ByVal cbCopy As Integer)

Dim cds As New COPYDATASTRUCT
Dim w1 As String, n As Long
Dim Byt() As Byte
CopyMemoryStruct(cds, lParam, Marshal.SizeOf(cds))'''''这一句在vb.net中如何更改??
Select Case cds.dwData
Case 1
Case 2
Case 3 '
'重定义数组大小
ReDim Byt(wParam - 1)
CopyMemoryByte (Byt(0), ByVal cds.lpData, cds.cbData)''''这一句在vb.net中如何更改??
一如既往哈 2010-12-28
  • 打赏
  • 举报
回复
好吧,贴出全部代码

以下代码在模块中:

Option Explicit
Public Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Public Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public Const WM_COPYDATA = &H4A
Global lpPrevWndProc As Long
Global gHW As Long, bFromHwnd As Long
'Copies a block of memory from one location to another.
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Public 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Sub Hook()
On Error Resume Next
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
'Debug.Print lpPrevWndProc
End Sub
Public Sub Unhook()
On Error Resume Next
Dim temp As Long
temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub
Public Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
If uMsg = WM_COPYDATA Then
'wParam 传递的是数组的大小
Call mySub(lParam, wParam)
End If
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
Public Sub mySub(lParam As Long, wParam As Long)
On Error Resume Next
Dim cds As COPYDATASTRUCT
Dim w1 As String, n As Long
Dim Byt() As Byte
Call CopyMemory(cds, ByVal lParam, Len(cds))
Select Case cds.dwData
Case 1
Form1.Text3.Text = "got a 1"
Case 2
Form1.Text3.Text = "got a 2"
Case 3 '
'重定义数组大小
ReDim Byt(wParam - 1)
Call CopyMemory(Byt(0), ByVal cds.lpData, cds.cbData)
w1 = StrConv(Byt, vbUnicode)
w1 = Left$(w1, InStr(1, w1, Chr$(0)) - 1)
n = InStr(w1, "|")
Form1.Text3.Text = Right(w1, Len(w1) - n)
bFromHwnd = CLng(Left$(w1, n - 1))
Form1.Lab1.Caption = "From:" & bFromHwnd
Form1.Lab.Caption = "Size:" & wParam
End Select
End Sub



以下代码在form中:

Option Explicit

Private Sub Command1_Click()
On Error Resume Next
If Not IsNumeric(Text1.Text) Then
MsgBox "请输入有效hwnd!"
Exit Sub
End If
If Len(Text2.Text) = 0 Then
MsgBox "请输入需要发送的内容!"
Exit Sub
End If
Dim cds As COPYDATASTRUCT, w1 As String, i As Long
Dim Byt() As Byte, bHwnd As Long, bSize As Long
bHwnd = Me.hwnd
w1 = CStr(bHwnd) & "|" & Text2.Text '合并me.hwnd到发送的字符串首位
Byt = StrConv(w1, vbFromUnicode) '直接转换成字节数组
bSize = UBound(Byt) + 1
cds.dwData = 3
cds.cbData = bSize
cds.lpData = VarPtr(Byt(0))
i = SendMessage(CLng(Text1.Text), WM_COPYDATA, bSize, cds) 'Me.hwnd
Lab.Caption = bSize ' IIf(i > 0, "发送成功!", "发送失败了")
End Sub
Private Sub Form_Load()
On Error Resume Next
Me.Caption = Me.hwnd
gHW = Me.hwnd
Hook
End Sub
Private Sub Form_Unload(Cancel As Integer)
Unhook
End Sub




测试方法很简单:编译完成后运行2份(运行后会设置窗体的caption为自身的hwnd),在“目标窗体hwnd”中输入对方的hwnd值,在要发送的内容中输入任意字符串,点击发送,即可相互通讯!!!!


我现在想把这个功能移植到vb.net中,就是在copymemory那里不知怎么修改!!!!


希望大侠们给看看

。。。。。。非常感谢!!!!
机器人 2010-12-28
  • 打赏
  • 举报
回复
不安全的操作是指,你直接非托管的修改内存数据。

怎么用就是直接赋值的方式。

比如:cds.dwData = 1 这样,而不是通过内存复制的方式。换句话说,非托管的方式死都不知道怎么死的。

说实话,我没弄明白: Call CopyMemory(cds, ByVal lParam, Len(cds)) 这句。
从 Long 到 cds 是什么意思。所以我猜想是byte()->Structure的过程。
如果能把 mysub 的调用代码贴出来看看就明白了。
Friday 2010-12-28
  • 打赏
  • 举报
回复
  
Sub Main()
Dim abc As STRC_A = New STRC_A
abc.strA = "A___"
abc.strB = Space(4)
abc.strC = "B___"
abc.buff.strBuff = "123"
Console.WriteLine(abc.Text)
Console.Read()
End Sub
一如既往哈 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fangxinggood 的回复:]
不过,仔细看你的代码之后,我觉得不需要RtlMoveMemory。
应该就是Byte() -> Structure, Structure -> Byte()的过程。
还是放弃这种不安全的操作比较好。这也是.NET取消LSet行为的目的。
[/Quote]
1、 怎么用?
2、不安全的操作 是指什么?

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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