在Win32中,确定资源是否已经存在的教科书解决scheme是:创build并检查GetLastError()是否返回ERROR_ALREADY_EXISTS。
例如:
HANDLE h = ::CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, name); bool alreadyExists = (h != INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_ALREADY_EXISTS);
但是下面的代码:
INVALID_HANDLE_VALUE = -1 m = mmap.mmap(INVALID_HANDLE_VALUE, length=size, tagname=name) print ctypes.get_last_error()
总是打印0,即使(命名的)mmap已经存在。
有没有一种简单的方法来模拟Python中的上述C / Win32代码?
你可以使用ctypes例如:
import ctypes def check_file_is_mapped_file(file_name,file_size): _CreateFileMapping = ctypes.windll.kernel32.CreateFileMappingW _GetLastError = ctypes.windll.kernel32.GetLastError INVALID_HANDLE_VALUE = -1 #from msdn PAGE_READWRITE = 0x04 #from msdn ERROR_ALREADY_EXISTS = 0xB7 #from msdn h =_CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,file_size, ctypes.c_wchar_p(file_name)) return (h != INVALID_HANDLE_VALUE) and (_GetLastError() == ERROR_ALREADY_EXISTS)