2013-06-07 3 views
0

Хорошо, эта проблема давно меня прослушивала.VB.NET Отправка строк через сообщение

У меня есть код для службы, которая обменивается данными строки клиента через PostMessage:

Public Sub SendToClient(msgs As String, types As Integer, hwnd As Long) 

     postMessage(hwnd, 0, Nothing, msgs) 

    End Sub 

Тогда у меня есть клиент, который принимает строку:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
     If (m.Msg = 0) Then 
      Dim a as string 
      a = Marshal.PtrToStringAuto(m.LParam) 
      end if 
     MyBase.WndProc(m) 
    End Sub 

Однако, клиент посылает ошибка, или некоторые беспорядки двоичных данных или даже просто пустая строка иногда. Кстати, m.LParam - это число.

Может ли кто-нибудь сказать мне, что является правильным способом отправки/получения строк через postmessage.

ответ

0

Я делаю это так:

Public Sub SendMessageToApp(ByVal NombreVentana As String, ByVal Mensaje As String, ByVal sender As Form) 
     Dim hWnd As IntPtr 
     Dim mCopyData As COPYDATASTRUCT 

     hWnd = CType(FindWindow(Nothing, NombreVentana), IntPtr) 
     Dim message As New System.Text.StringBuilder 

     If (CInt(hWnd) <> 0) Then 

      message.Append(Mensaje) 

      Dim pCopyData As IntPtr = Marshal.AllocHGlobal(message.Length() + 40) 


      mCopyData.lpData = Marshal.StringToHGlobalAnsi(message.ToString) 
      mCopyData.cbData = message.Length 
      mCopyData.dwData = CType(_messageID, IntPtr) 
      Marshal.StructureToPtr(mCopyData, pCopyData, False) 

      SendMessage(hWnd, WM_COPYDATA, CInt(sender.Handle), pCopyData) 
      Marshal.FreeHGlobal(mCopyData.lpData) 
      Marshal.FreeHGlobal(pCopyData) 

     End If 
    End Sub 

Receiver окно:

Declarations and definitions: 

Const WM_COPYDATA As Integer = 74 
    Const SIG_LENGTH As Integer = 36 
    Const MAX_COPY_LENGTH As Integer = 128 
    Const SigConnect As String = "F7B82657-BD18-4ee6-B182-78721293821C" 
    Dim CDCount As Integer 

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer 

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
    (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _ 
    ByVal lParam As IntPtr) As Integer 

    Dim hWndSender As Integer 
    Private Const _messageID As Integer = 10 

    'Estructura obligatoria para poder utilizar el API CopyData 
    <StructLayout(LayoutKind.Sequential)> _ 
    Private Structure COPYDATASTRUCT 
     Public dwData As IntPtr 
     Public cbData As Integer 
     Public lpData As IntPtr 
    End Structure 

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 

     If m.Msg = WM_COPYDATA Then 
      Dim Estructura As COPYDATASTRUCT 
      Dim tipo As Type = Estructura.GetType 
      Dim message As String 

      Estructura = CType(m.GetLParam(GetType(COPYDATASTRUCT)), COPYDATASTRUCT) 

      'Here you get the message 
      message = Marshal.PtrToStringAnsi(Estructura.lpData, Estructura.cbData) 

     End If 
+0

Я получаю "Ошибка при создании дескриптора окна. У вас есть более простой код? – user2444615

+0

Это простейший код для sendMEssage, вы должны объявить структуру COPYDATASTRUCT и объявить все константы. Где вы получаете ошибку? Вы должны быть уверены, что здесь: hWnd = CType (FindWindow (Nothing, NombreVentana), IntPtr), ваш hWnd имеет значение. Вы должны найти окна с помощью NombreVentana, что означает «WindowName» –

+0

Благодарим за код. Это сработало! – user2444615

Смежные вопросы