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

Posted

技术标签:

【中文标题】通过 IPC 将字符串发送到另一个应用程序【英文标题】:Sending a string to another application via IPC 【发布时间】:2014-10-24 18:01:09 【问题描述】:

我在 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

就应用而言,一切都运行良好 - 完全没有错误。但显然它不起作用。 :)

【问题讨论】:

客户端应用程序是否可能一次只处理一个字母? 否;它一次处理整个字符串。我有它的代码,最终我们会将它迁移到 .NET,但目前它仍停留在经典中。此外,在我测试它时,我将它传递给我创建的客户端应用程序,它只是一个带有文本框的窗口,文本框上绝对没有代码隐藏。 【参考方案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)

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

【讨论】:

这对于国际文本将失败。您想知道如何解决这个问题并发送 UTF-16。 当然,大卫。我们只需要它,以便我们可以向正在运行的进程发送命令(在这种情况下,将数据库表中的 ID 发送到与我们的数据库分离的进程),但如果有更健壮的代码来处理国际文本会很好也是。 没关系。你已经接受了,所以我想这意味着你已经完成了。

以上是关于通过 IPC 将字符串发送到另一个应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在树莓派上用 C++ 从一个 Linux 应用程序到另一个应用程序的最简单 IPC

Firebreath 中的 IPC (boost c++)

通过 Electron 的 IPC 渲染器发送敏感数据

使用管道进行 IPC

通过 IPC 从 C 向 Python 发送二进制数据

我们如何在 UI 线程中创建处理程序以将数据发送到另一个线程