2012-04-25 7 views
1

Win32では、リソースが既に存在するかどうかを判断するためのテキストブックソリューションは、作成し、GetLastError()がERROR_ALREADY_EXISTSを返すかどうかを確認します。例えばPythonを使用して(Windows)メモリマップファイルが既に存在するかどうかを調べる方法

:Pythonで

HANDLE h = ::CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, name); 
bool alreadyExists = (h != INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_ALREADY_EXISTS); 

、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でエミュレートする簡単な方法はありますか?

答えて

1

あなたはたとえば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)