2017-09-21 16 views
0

64 비트 파이썬 응용 프로그램에서 kernel32의 InterlockedExchange을 사용하려고합니다. 32 비트에서 64 비트가 아닌 ctypes로 일부 kernel32 함수에 액세스 할 수 있습니다.

내가 이상적으로하고 싶은 코드 작업 : 내가 기대하는 것처럼

C:\Users\Douglas Sexton\Source\Repos\SharedMemory\SharedMemory\Python>python interlocked3.py 
5 
Traceback (most recent call last): 
File "interlocked3.py", line 10, in <module> 
print(windll.kernel32.InterlockedExchange(byref(interlockedValue), locked)) 
File "C:\Program Files (x86)\Python35\lib\ctypes\__init__.py", line 360, in __getattr__ 
func = self.__getitem__(name) 
File "C:\Program Files (x86)\Python35\lib\ctypes\__init__.py", line 365, in __getitem__ 
func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: function 'InterlockedExchange' not found 

32 비트 작동 : 그러나 이것은 64 비트 파이썬 3.5.2 내 OUPUT이

import ctypes 
from ctypes import * 

interlockedValue = ctypes.c_long(5) 

print(interlockedValue.value) 

locked = ctypes.c_long(68) 
print(windll.kernel32.InterlockedExchange(byref(interlockedValue),locked)) 

print(interlockedValue.value) 

입니다 하지만 :

C:\Users\Douglas Sexton\Source\Repos\SharedMemory\SharedMemory\Python>"C:\Program Files (x86)\Python36\python.exe" interlocked3.py 
5 
5 
68 
나뿐만 아니라 서수에서 접근 시도

:

,363,210
import ctypes 
from ctypes import * 

interlockedValue = ctypes.c_long(5) 

print(interlockedValue.value) 

locked = ctypes.c_long(68) 

print(windll.kernel32[868](byref(interlockedValue), locked)) 

print(interlockedValue.value) 

이이 출력 32 비트 있지만 64 비트에 대해 동일한 출력했다 : 지금 파이썬 (64)에서 InterlockedExchange에 액세스 할 수있는 몇 가지 방법을 시도

C:\Users\Douglas Sexton\Source\Repos\SharedMemory\SharedMemory\Python>python interlocked.py 
5 
0 
0 

와 모두로 실행하는 것 같은 문제. 나는 파이썬 64에서 다른 kernel32 함수를 사용할 수 있었다. 이것은 나를 미치게 만든다.

+0

분명히 x64 ABI에서 ['InterlockedExchange'] (https://msdn.microsoft.com/en-us/library/ms683590)는 컴파일러 intrinsic ['_InterlockedExchange'] (https : // docs.microsoft.com/en-us/cpp/intrinsics/interlockedexchange-intrinsic-functions). – eryksun

+0

BTW, Windows API의 경우'ctypes.windll.kernel32' 대신'kernel32 = ctypes.WinDLL ('kernel32', use_last_error = True)'를 사용하는 것이 더 좋습니다. 이것은 전역'windll' 객체에 대한 프로토 타입 캐싱을 피하고 ctypes가 WinAPI 마지막 에러 값을 보호 할 수있게합니다. 이 경우 마지막 에러 값은'ctypes.get_last_error()'를 통해 얻을 수 있으며,'ctypes.set_last_error (value)'를 통해 미리 설정할 수있다. 호출이 실패하면'raise ctypes.WinError (ctypes.get_last_error()) '를 통해 예외를 발생시킵니다. – eryksun

+0

@eryksun 귀하의 의견에 감사드립니다. 나는 InterlockedExchange에 대한 래퍼 일 뿐이라는 DLL을 만들 수 있다고 생각하니? –

답변

0

나는 이것을 위해 필요하지 않게되었지만 InterlockedExchange에 대한 wrapper dll을 만들 수 있었고 64 프로세스에서 성공적으로 사용할 수있었습니다.