在Windows操作系统上的Python和Win32之间的IPC

mur*_*mak 2 c++ python winapi

我有两个可以通过win32 IPC API(CreateFileMapping()等进行通信的C应用程序)

我必须用Python应用程序替换客户端应用程序.

我在Python端尝试了以下库.

导入win32file,win32api

但是这个库没有CreateFileMapping()函数.

我也尝试了mmap.mmap()函数,但我无法观察到任何通信.

import mmap

sharedMemory = mmap.mmap(0, 512, "Local\\SharedBuffer")

sharedMemory.write("AB")
Run Code Online (Sandbox Code Playgroud)

我还试过"Global\SharedBuffer"和"SharedBuffer"作为共享内存名称的两个方面.

#define SHARED_BUFFER_NAME          ((LPCSTR)L"Local\\SharedBuffer")

HANDLE bufferHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 512, SHARED_BUFFER_NAME);

// Create a map for accessing Shared Buffer
sharedBuffer = (char*)MapViewOfFile(bufferHandle, FILE_MAP_ALL_ACCESS, 0, 0, SHARED_BUFFER_SIZE);

memset(sharedBuffer, 0, SHARED_BUFFER_SIZE);

while (sharedBuffer[0] == 0);

while (1);
Run Code Online (Sandbox Code Playgroud)

win32 API对我来说不是强制性的.我只需要Windows机器上C和python应用程序之间的简单共享缓冲区.

谢谢

Bra*_*don 10

我测试了它..它的工作原理..首先运行C++代码.它将创建一个内存映射.然后运行python代码.它会写入地图.C++代码将读取地图并打印写入的内容.

我知道这段代码很糟糕,因为我没有正确地序列化数据(也就是首先将文件的大小写入文件然后等等)但是meh ..这只是一个基本的工作示例 ..仅此而已.

蟒蛇:

import mmap

shm = mmap.mmap(0, 512, "Local\\Test") #You should "open" the memory map file instead of attempting to create it..
if shm:
    shm.write(bytes("5", 'UTF-8'));
    shm.write(bytes("Hello", 'UTF-8'))
    print("GOOD")
Run Code Online (Sandbox Code Playgroud)

C++:

#include <windows.h>
#include <cstring>
#include <cstdbool>
#include <iostream>

typedef struct
{
    void* hFileMap;
    void* pData;
    char MapName[256];
    size_t Size;
} SharedMemory;

bool CreateMemoryMap(SharedMemory* shm)
{
    if ((shm->hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, shm->Size, shm->MapName)) == NULL)
    {
        return false;
    }

    if ((shm->pData = MapViewOfFile(shm->hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, shm->Size)) == NULL)
    {
        CloseHandle(shm->hFileMap);
        return false;
    }
    return true;
}

bool FreeMemoryMap(SharedMemory* shm)
{
    if (shm && shm->hFileMap)
    {
        if (shm->pData)
        {
            UnmapViewOfFile(shm->pData);
        }

        if (shm->hFileMap)
        {
            CloseHandle(shm->hFileMap);
        }
        return true;
    }
    return false;
}

int main()
{
    SharedMemory shm = {0};
    shm.Size = 512;
    sprintf(shm.MapName, "Local\\Test");

    if (CreateMemoryMap(&shm))
    {
        char* ptr = (char*)shm.pData;
        memset(ptr, 0, shm.Size);

        while (ptr && (*ptr == 0))
        {
            Sleep(100);
        }

        int size = (int)*ptr;
        ptr += sizeof(char);

        int i = 0;
        for (; i < size; ++i)
        {
            std::cout<<ptr[i];
        }
        FreeMemoryMap(&shm);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句..这是C代码..不是真正的C++(除了使用`std::cout`之外,我从我的github上获取了这个C结构及其附带的函数。 (2认同)