列一下目前用到的Windows进程通信方法

1.发送WM_COPYDATA消息:

个人目前认为最简单的方法 --获取对应顶级窗口名字和句柄 直接发送消息 ,对应接受端只需像处理其它消息那样处理WM_COPY DATA消息

     HWND hWnd = ::FindWindowW(LPCWSTR(classname),LPCWSTR(windowname));  //找句柄

     ::SendMessageW(hWnd, WM_COPYDATA,NULL, (LPARAM)&cpd);                            //发送窗口消息

 

//接受 由于我是Qt客户端 直接用窗口nativeEvent事件直接读取即可。   

下面贴一个其他博客的一般接受===========

#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdio.h>
int main()
{
    const char szDlgTitle[] = "RecvMessage";
 
    HWND hSendWindow = GetConsoleWindow ();
    if (hSendWindow == NULL)
        return -1;
    HWND hRecvWindow = FindWindow(NULL, szDlgTitle);
    if (hRecvWindow == NULL)
        return -1;
 
    char szSendBuf[100];
    time_t  timenow;
    COPYDATASTRUCT CopyData;
 
    for (int i = 0; i < 10; i++)
    {
        time(&timenow);
        sprintf(szSendBuf, "%s", ctime(&timenow));//注意,ctime()返回的字符串后面带了'\n'
        CopyData.dwData = i;
        CopyData.cbData = strlen(szSendBuf);
        szSendBuf[CopyData.cbData - 1] = '\0';
        CopyData.lpData = szSendBuf;
 
        SendMessage(hRecvWindow, WM_COPYDATA, (WPARAM)hSendWindow, (LPARAM)&CopyData);
        printf("%s\n", szSendBuf);
        Sleep(1000);
    }
    return 0;
}

2.管道:

   管道是一种用于在进程间共享数据的机制,其实质是一段共享内存。Windows系统为这段共享的内存设计采用数据流I/0的方式来访问。由一个进程读、另一个进程写,类似于一个管道两端,因此这种进程间的通信方式称作“管道”。

    管道分为匿名管道和命名管道。

    匿名管道只能在父子进程间进行通信,不能在网络间通信,而且数据传输是单向的,只能一端写,另一端读。

    命令管道可以在任意进程间通信,通信是双向的,任意一端都可读可写,但是在同一时间只能有一端读、一端写。

     具体代码下面这篇大佬博客可以学下

     https://www.cnblogs.com/mydomain/archive/2011/01/10/1931914.html

 

3.共享内存

最快的通信方式 写下Qt的QSharedMemory类的共享内存使用伪代码

//将该进程与共享内存段分离

sharedMemory.detach()

//将数据加载到共享内存中,需要加锁

 

 

 

 

 

4.tcp/ip通信