1

我有用本机 C++ 编写的代码,它控制由 CreatePrcess() 和其他 Windows API 创建的其他进程(“客户端进程”)
然后客户端进程(控制台、单线程)等待来自“服务器”进程的消息 MSG_OK 并恢复运行收到消息时。
我使用了 PostThreadMessage() 并且效果很好。

int MSG_OK = RegisterWindowMessage("MSG_OK");
void run(TCHAR* path) {
    STARTUPINFO si={0,}; si.cb=sizeof(STARTUPINFO); si.dwFlags=0;
    PROCESS_INFORMATION pi;
    CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    Sleep(1000); // Just for simplicity. Actual code is message-based
    PostThreadMessage(pi.dwThreadId, MSG_OK, 0, 0);
    CloseHandle(pi.hProcess);   // closing process handle makes usage count 1
    CloseHandle(pi.hThread);    
}

现在我想用 C# 重写代码,尽可能少地使用 p/invoke。以下是我正在处理的代码:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostThreadMessage(uint threadId, int msg, IntPtr wParam, IntPtr lParam);

public void run(string path) {
    Process proc = new Process();
    ProcessStartInfo si = new ProcessStartInfo();
    si.FileName = path;
    proc.StartInfo = si;
    proc.Start();
    uint threadId; // <----?
    PostThreadMessage(threadId, MSG_OK, 0, 0);
    proc.Dispose();
}

我找到了诸如 Process 和 ProcessStartinfo 之类的 C# 类,但找不到任何类似于 dwThreadId 的成员。有没有?

编辑:由于客户端进程是单线程应用程序,

 proc.Threads[0].id

似乎是我正在寻找的threadId。难道我做错了什么?

4

1 回答 1

0

请看这个线程

我会考虑使用其他一些方法,如互斥锁、事件或信号量

于 2012-12-11T07:57:47.237 回答