我有两个可以通过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)
| 归档时间: |
|
| 查看次数: |
3698 次 |
| 最近记录: |