下午好,SendMessage函數 - 從VB6將字符串傳遞到VB.NET
我試圖使用SendMessage函數從VB6 EXE傳遞一個字符串,在.NET 2013 EXE。我知道該消息正在進入.NET EXE,因爲我可以在其上設置斷點,並且在從VB6 EXE調用SendMessage時它會出現。我遇到的問題是檢索字符串。
這是我在嘗試做到這一點:
VB6代碼:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, Source As Any, ByVal bytes As Long)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal msg As Long, wParam As Long, lParam As Any) As Long
Private Const APPVIEWER_OPEN = &H400
Private Sub Command1_Click()
Dim hwndAppViewer As Long
Dim bytBuffer(1 To 255) As Byte
Dim sParams As String
Dim lStringAddress As Long
hwndAppViewer = FindWindow(vbNullString, "DotNetReceiver")
If hwndAppViewer > 0 Then
sParams = "STRINGDATA"
CopyMemory bytBuffer(1), sParams, Len(sParams)
lStringAddress = VarPtr(bytBuffer(1))
SendMessage hwndAppViewer, APPVIEWER_OPEN, Me.hwnd, lStringAddress
End If
End Sub
這裏是.NET代碼:
Imports System.Runtime.InteropServices
Public Class Form1
Protected Overrides Sub WndProc(ByRef m As Message)
Dim sPolicyInformation As String
If m.Msg = &H400 Then
sPolicyInformation = Marshal.PtrToStringAnsi(m.LParam)
Else
MyBase.WndProc(m)
End If
End Sub
End Class
問題是當我嘗試和檢索字符串。我收到一個空白字符串。我注意到,在VB6 lStringAddress和數量在.NET m.lParam數量是完全不同的,所以我必須失去了一些有關如何我路過的地址,通過lParam的。
任何想法我可能會丟失?
謝謝。
要做你想做的事,我相信你需要使用RegisterWindowMessage函數(參見:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947%28v=vs.85%29 .aspx)來獲取可能在應用程序之間傳輸的消息編號。然後,您將使用PostMessage發送消息給HWND_BROADCAST(&HFFFF)。這兩個應用程序都需要使用相同的密鑰來調用RegisterWindowMessage以獲取要監視的消息編號。 – TnTinMn
而不是使用SendMessage函數洗牌周圍的指針的地址空間,您可以考慮使用[WM_COPYDATA(https://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(V = vs.85) .aspx)消息,這更適合這種情況。 –
指針只在其擁有的進程地址空間中有意義。你需要編組數據。 WM_COPYDATA是你的傢伙。 –