3

我有 2 个程序,我需要一种方法让其中一个程序以某种方式向另一个程序发送消息。我研究了 Win32 API 中的 SendMessage 函数,虽然只要你有窗口句柄它就可以很好地工作,但我的程序需要能够在服务下注销时运行,这意味着它不能创建窗口句柄.

有什么方法可以在不创建窗口句柄的情况下接收来自另一个进程的消息?我一直在寻找Win32是否有其他方式可以连接到消息传递中,这样我就不需要依赖窗口句柄,但是必须有某种方式在基本级别的进程之间进行通信,不是不在那里?

我已经研究过使用 Pipe 来做到这一点,但遇到了巨大的权限问题,除此之外,它的级别比我真正想要的要高得多。我需要做的就是发送一个简单的自定义 int 消息,以便我的进程知道是时候关闭了。

4

3 回答 3

4

如果它真的像通知其他程序关闭一样简单,那么您可以创建一个命名事件。两个进程都创建具有相同名称的事件。一个监视它,另一个可以发出信号。观看者可以通过使用MsgWaitForMultipleObjects而不是 PeekMessage 的修改后的消息泵来做到这一点。

这里存在轻微的拒绝服务风险,因为恶意进程可能会创建同名事件并导致您的其他应用程序退出。

如果您需要更复杂的通信,您将需要管道、邮槽、共享内存、文件监视、注册表监视或使用另一个可同步的内核事件(互斥锁、信号量等)。

于 2012-09-18T23:00:02.507 回答
0

这工作正常:

// msg.c:

#include <windows.h>
#include <stdio.h>

int CALLBACK WinMain (_In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) {
    MSG msg;
    DWORD curThreadId;

    curThreadId = GetCurrentThreadId();

    // Send messages to self:
    PostThreadMessage(curThreadId, WM_USER, 1, 2);
    PostThreadMessage(curThreadId, WM_USER+1, 3, 4);
    PostThreadMessage(curThreadId, WM_USER+2, 5, 6);
    PostThreadMessage(curThreadId, WM_USER+3, 7, 8);
    PostThreadMessage(curThreadId, WM_QUIT, 9, 10);

    while (GetMessage(&msg, NULL, 0, 0)) {
        printf("message: %d; wParam: %d; lParam: %d\n", msg.message, msg.wParam, msg.lParam);
    }

    return (int) msg.wParam;
}

制作:

> g++ -m64 -mwindows -c -o msg.o msg.c
> g++ -s -o msg.exe msg.o
> msg.exe
message: 1024; wParam: 1; lParam: 2
message: 1025; wParam: 3; lParam: 4
message: 1026; wParam: 5; lParam: 6
message: 1027; wParam: 7; lParam: 8

> echo %ERRORLEVEL%
9
于 2019-02-12T21:15:09.993 回答
0

如果您的 IPC 不需要任何参数,则您的服务可以实现其Handler/Ex()查找的自定义控制代码,然后其他应用程序可以使用ControlService()该控制代码将该控制代码发送到服务。

不过,可以改为使用以编程方式关闭服务ControlService(SERVICE_CONTROL_STOP)Handler/Ex()该服务应在收到SERVICE_CONTROL_STOP请求时自行关闭。

于 2019-02-12T21:35:10.587 回答