2015-06-23 116 views
0

下午好,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的。

任何想法我可能會丟失?

謝謝。

+0

要做你想做的事,我相信你需要使用RegisterWindowMessage函數(參見:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947%28v=vs.85%29 .aspx)來獲取可能在應用程序之間傳輸的消息編號。然後,您將使用PostMessage發送消息給HWND_BROADCAST(&HFFFF)。這兩個應用程序都需要使用相同的密鑰來調用RegisterWindowMessage以獲取要監視的消息編號。 – TnTinMn

+0

而不是使用SendMessage函數洗牌周圍的指針的地址空間,您可以考慮使用[WM_COPYDATA(https://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(V = vs.85) .aspx)消息,這更適合這種情況。 –

+1

指針只在其擁有的進程地址空間中有意義。你需要編組數據。 WM_COPYDATA是你的傢伙。 –

回答

1

您發送的是ANSI字符串VB.NET。 VB6是爲所有MS的操作系統設計的,9x不是unicode。所以傳遞給API調用的所有字符串都將轉換爲ANSI。當Windows收到它時,Windows會將該ANSI字符串轉換爲VB.NET程序的unicode。

使用sendmessagew功能和發送一個字節數組的空值終止的第一個元素。

Dim MyStr() as byte 
MyStr = "cat" & chrw(0) 

只傳遞第一個元素SendMessageW即MyStr(0)。 Windows API使用以null結尾的C字符串。 COM和VB6使用BStr(一個大小頭和一個非空終止的字符串)。

當傳遞字符串由參傳遞標題的地址。當通過值傳遞時,你傳遞第一個字符的地址(如果你在最後加上一個空值,把它作爲一個c字符串)。