【问题标题】:Talking to unmanaged process from .NET从 .NET 与非托管进程对话
【发布时间】:2010-10-07 19:53:04
【问题描述】:

我正在使用 Process.Start 从 .NET 创建一个进程。新进程是一个遗留应用程序,用 C/C++ 编写。为了与之通信,我需要对其主线程执行相当于 PostThreadMessage 的操作。

我很乐意使用 P/Invoke 调用 PostThreadMessage,但我看不到如何找到主线程。 Process 对象有一个线程集合,但文档说集合中的第一项不必是主线程。 Thread 对象本身似乎没有任何迹象表明它们是否是主要的。虽然我可以在创建进程后立即查看线程集合,但这并不能保证只有一个。

那么,有没有办法让我从 .NET 中确定另一个进程的主线程,还是我需要求助于使用 Win32 的 CreateProcess?

谢谢,

鲍勃

【问题讨论】:

    标签: .net interprocess


    【解决方案1】:

    如果进程有窗口,可以使用GetWindowThreadProcessIdAPI获取GUI线程,一般为主线程(使用Process.MainWindowHandle获取窗口句柄)。

    另一种选择是枚举线程 (Process.Threads) 并根据 StartTime 选择第一个启动的线程:

    Process process = Process.Start(...);
    process.WaitForInputIdle();
    ProcessThread primaryThread = process.Threads.OrderBy(t => t.StartTime).First();
    

    但这可能不是一个非常准确的技术......

    【讨论】:

    • 很遗憾,旧版应用程序没有窗口。如果一个进程快速启动多个线程,它们的启动时间可能相同。
    【解决方案2】:

    您不需要 Window 来使用线程消息队列。只要线程调用 GetMessage 或 PeekMessage 等用户函数,就会创建线程消息队列。

    在此处查看更多信息:About Messages and Message Queues

    您仍然需要通过某种方式确定“主要”线程 ID(并且发布线程/进程也需要足够的权限)。

    这里有答案:http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/42de8f6a-61f4-495e-a69d-bd018e07c6f7

    (请参阅“nobugz”答案)

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多