• 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;
            }
        ​
        }
      •  

  • 相关阅读:
    一些Asp.Net面试题答案
    未能加载文件或程序集"Microsoft.Web.Infrastructure 的解决方案
    偶然的发现(与Code无关)
    配置一台测试机 每个域用户独立会话
    使用 Git 和 Visual Studio Online 进行版本控制
    1.大数据概述
    递归下降语法分析程序设计
    文法 LL1
    C语言的文法分析
    词法分析
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10932778.html
Copyright © 2020-2023  润新知