1

Win32 では、リソースが既に存在するかどうかを判断する教科書的な解決策は、リソースを作成し、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);  

Python では、mmap モジュールがメモリ マップ ファイルをラップします。

しかし、次のコード:

INVALID_HANDLE_VALUE = -1  
m = mmap.mmap(INVALID_HANDLE_VALUE, length=size, tagname=name)  
print ctypes.get_last_error()  

(指定された) mmap が既に存在する場合でも、常に 0 を出力します。

上記の C/Win32 コードを Python でエミュレートする簡単な方法はありますか?

4

1 に答える 1

2

たとえば、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)
于 2016-09-13T11:01:50.233 に答える