下面是一个代码,用于使用内存映射将值写入内存。当我试图运行代码时,我得到了错误 “文件”MMF.py“,第26行,in 内存(pBuf,szMsg,len(szMsg)) 错误:异常:写入0xfffffffa1c001b“时访问冲突
import msvcrt, mmap
import ctypes
from ctypes import *
FILE_MAP_ALL_ACCESS = 0x04
INVALID_HANDLE_VALUE = 0xFFFFFFFF
SHMEMSIZE = 256
PAGE_READWRITE = 0x04
szName = ctypes.c_wchar_p("MyFileMappingObject")
szMsg = "Message from Python(ctypes) process"
hMapObject = windll.kernel32.CreateFileMappingA(INVALID_HANDLE_VALUE,None, PAGE_READWRITE, 0, SHMEMSIZE, szName)
print("Handle:",hMapObject)
if (hMapObject == 0):
print("Could not open file mapping object")
raise WinError()
pBuf = windll.kernel32.MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS,0, 0, SHMEMSIZE)
print("Buffer Starting Addr:",pBuf)
if (pBuf == 0):
print("Could not map view of file")
raise WinError()
else:
print(len(szMsg))
memcpy = cdll.msvcrt.memcpy
memcpy(pBuf, szMsg, len(szMsg))
shmem = mmap.mmap(0, 256, "MyFileMappingObject_ctypes", mmap.ACCESS_WRITE)
shmem.write("Message Python process")
msvcrt.getch()
windll.kernel32.UnmapViewOfFile(pBuf)
windll.kernel32.CloseHandle(hMapObject)
shmem.close()
在任何事情之前,这里有(几乎)你需要的一切:[Python 3]: ctypes - A foreign function library for Python。
ctypes.wintypes
没有解释,但是可以通过在Python控制台中运行dir(ctypes.wintypes)
来查看其导出。注意,所有这些类型都是简单的ctypes类型,我使用它们只是为了约定/一致性/可读性。您更新的代码(code.py):
注意:
根据上一页:
因此,我还添加了[Docs.MS]: RtlCopyMemory function来替换
memcpy
(您可以注释掉它的行,我把它留在那里只是为了表明它是有效的),如您从中获取代码并试图转换它的示例([MS.Docs]: Creating Named Shared Memory)中所示([minwinbase.h:36]:#define CopyMemory RtlCopyMemory
)输出:
相关问题 更多 >
编程相关推荐