zoukankan      html  css  js  c++  java
  • Windows提高_1.4进程通信

    进程通信

    • 使用 WM_COPYDATA

      • 客户端(发送端)

        // 1. 找到窗口程序
        HWND hWnd = FindWindow(NULL, L"Window1");
        ​
        // 2. 构建一个 COPYDATASTRUCT 结构体
        COPYDATASTRUCT CopyData = { 0 };
        CopyData.dwData = 0x100;                    // 要传递的一个4字节数据,通常是类型
        CopyData.cbData = 0x0A;                     // 存储数据的缓冲区大小
        CopyData.lpData = (LPVOID)"Hello15pb";      // 指向要发送的数据
        // 3. 发送数据给对象的窗口
        SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);
      • 服务端(接收端)

        // 响应 WM_COPYDATA 消息
        case WM_COPYDATA:
        {
            // 1. 获取 LPARAM 只想的内容
            auto CopyData = (PCOPYDATASTRUCT)lParam;
        ​
            // 2. 输出内容
            MessageBoxA(hWnd, (LPCSTR)CopyData->lpData, "WM_COPYDATA", MB_OK);
        ​
            break;
        }
    • 使用 邮槽内核对象

      • 客户端(发送端)

        // 1. 打开邮槽对象
        HANDLE hFile = CreateFile(
            L"\\.\mailslot\Sample", // 邮槽名称
            GENERIC_WRITE,              // 读写属性
            FILE_SHARE_READ,            // 共享属性
            NULL,                       // 安全属性
            OPEN_EXISTING,              // 打开方式
            FILE_ATTRIBUTE_NORMAL,      // 标志位
            NULL);                      // 文件模板(默认留空)
        // 2. 向mailslot写入
        DWORD dwWritten = 0;
        WriteFile(hFile, "Hello", 6, &dwWritten, NULL);
        ​
        // 3. 结束
        printf("已经向邮槽写入信息!
        ");
        CloseHandle(hFile);
      • 服务端(接收端)

        // 1. 创建邮槽对象
        HANDLE hSlot = CreateMailslot(
            L"\\.\mailslot\Sample",     // 邮槽名
            0,                              // 不限制消息大小 
            MAILSLOT_WAIT_FOREVER,          // 无超时 
            NULL);                          // 安全属性
        // 2. 循环读取邮槽信息
        while (true) 
        {
            // 2.1 获取邮槽消息数量
            DWORD dwMsgCount = 0, dwMsgSize = 0;
        ​
            // 2.2 获取邮槽信息
            GetMailslotInfo(
                hSlot,                  // 邮槽句柄 
                NULL,                   // 无最大消息限制
                &dwMsgSize,             // [ 下一条消息的大小 ]
                &dwMsgCount,            // [ 消息的总数量 ]
                NULL);                  // 无时限
        // 2.3 如果没有接收到消息,那么久休眠一阵子
            if (dwMsgSize == MAILSLOT_NO_MESSAGE) 
            {
                Sleep(2000);
                continue;
            }
        ​
            // 2.4 循环获取全部消息(有可能不只一条)
            while (dwMsgCount)
            {
                DWORD dwRet = 0;
                PBYTE lpBuffer = new BYTE[dwMsgSize]{ 0 };
        ​
                // 2.5 读取邮槽中的信息
                if (!ReadFile(hSlot, lpBuffer, dwMsgSize, &dwRet, NULL))
                {
                    printf("ReadFile函数执行失败,错误码:%d.
        ", GetLastError());
                    delete[] lpBuffer;
                    return 0;
                }
                printf("邮槽的内容: %s
        ", lpBuffer);
        ​
                // 2.6 计算剩余的消息数
                GetMailslotInfo(hSlot, (LPDWORD)NULL, &dwMsgSize, &dwMsgCount, nullptr);
                delete[] lpBuffer;
            }
        ​
        }
      •  

  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10932778.html
Copyright © 2011-2022 走看看