通过IPC将字符串发送到另一个应用程序

时间:2014-10-24 18:01:09

标签: .net vb.net pinvoke ipc

我在VB.NET中有一个服务器应用程序,它试图将文本消息发送到客户端应用程序窗口中的文本框,用经典VB编写(我无法控制客户端代码)。我正在使用IPC,特别是“SendMessageTimeout”PInvoke。

我想将“Hello World”发送到客户端的文本框中。当我运行应用程序时,它发送“H”(但不发送“ello World”)。如果我将消息更改为“Test 1-2-3”,则会发送“T”(但不是“est 1-2-3”)。

如何发送整条信息?

下面的代码(“lParam”是我要发送的字符串):

   Private Function fSendString(ByVal hwnd As IntPtr, ByVal uMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr

      Try
         Dim lResult As IntPtr
         Dim GCH As GCHandle = GCHandle.Alloc(lParam, GCHandleType.Pinned)
         Dim pS As IntPtr = GCH.AddrOfPinnedObject
         If SendMessageTimeout(hwnd, uMsg, wParam, pS, 0, 25, lResult) Then
            'If this function returns true, the result holds the return value.
            fSendString = lResult
         End If
         GCH.Free()
      Catch ex As Exception
         MsgBox("fSendString(): " & ex.ToString)
         fSendString = Nothing
      End Try

      Return fSendString

   End Function

就应用程序而言,一切运行正常 - 完全没有错误。但显然它不起作用。 :)

1 个答案:

答案 0 :(得分:1)

我找到了答案。显然通过GCHandle.Alloc固定它,然后获取GCHandle的IntPtr是问题的原因。我通过替换以下行来解决它:

     Dim GCH As GCHandle = GCHandle.Alloc(lParam, GCHandleType.Pinned)
     Dim pS As IntPtr = GCH.AddrOfPinnedObject

使用:

     Dim pS As IntPtr = Marshal.StringToHGlobalAnsi(lParam)

执行此操作后,字符串完全传递到客户端窗口的文本框中。