2014-09-30 135 views
-1

我有(的CreateFileMapping()等)两个C应用程序,可以通过的Win32 API的IPC通信IPC的Python和Win32之间在Windows OS

我有一个Python应用程序以替换客户端应用程序。

我已经尝试了Python端的以下库。

进口win32file,Win32API的

但这库没有的CreateFileMapping()函数。

我也试过mmap.mmap()函数,但我无法观察任何通信。

import mmap 

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

sharedMemory.write("AB") 

我也尝试过“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); 

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

谢谢

+1

为什么你铸造'常量为wchar_t *'的'为const char *'? – Brandon 2014-09-30 07:50:27

+0

这个铸件在哪里? MapViewOfFile()函数返回'void *',所以我将它转换为char数组来访问字节。 – muratcakmak 2014-09-30 07:53:52

+0

我还需要帮助。任何回应? – muratcakmak 2014-10-02 13:34:54

回答

7

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

我知道这段代码是坏的,因为我没有正确序列化数据(也就是将大小写入文件,然后是数据等)。 )但是,这是只是一个基本的工作示例 ..没有更多。

的Python:

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") 

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); 
    } 
} 
+1

Btw ..这是C代码..不是真正的C++(除了使用'std :: cout'外,我从我的github中获取了这个C结构及其相关函数。 – Brandon 2014-10-03 00:39:31