2012-04-25 2 views
1

Win32에서 리소스가 이미 있는지 여부를 확인하는 교과서 솔루션은 다음과 같습니다. 생성하고 GetLastError()가 ERROR_ALREADY_EXISTS를 반환하는지 확인합니다. 예를 들어파이썬을 사용하여 (windows) 메모리 맵핑 파일이 이미 있는지 알아 보는 방법

:

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 코드를 파이썬으로 에뮬레이션하는 간단한 방법이 있습니까?

답변

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) 
관련 문제