1

CreatePrcess()および他のWindows APIによって作成された他のプロセス(「クライアントプロセス」)を制御するネイティブC ++で記述されたコードがあります。
次に、クライアントプロセス(コンソール、シングルスレッド)は「サーバー」プロセスからのメッセージ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);    
}

ここで、p / invokeをできるだけ使用せずに、C#でコードを書き直したいと思います。以下は私が取り組んでいるコードです:

[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 に答える