0
我想在64位Python應用程序中使用kernel32中的InterlockedExchange。可以訪問32位ctypes但不是64位的一些kernel32函數
這是代碼,我會非常喜歡有工作:
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)
然而,這是我的輸出中有64位蟒蛇3.5.2:
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位工程,我期望雖然:
C:\Users\Douglas Sexton\Source\Repos\SharedMemory\SharedMemory\Python>"C:\Program Files (x86)\Python36\python.exe" interlocked3.py
5
5
68
我試圖從序訪問,以及:
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位相同的輸出是這樣的輸出:
C:\Users\Douglas Sexton\Source\Repos\SharedMemory\SharedMemory\Python>python interlocked.py
5
0
0
我已經嘗試了幾種不同的方式從蟒蛇64現在訪問InterlockedExchange和似乎都碰上同樣的問題。我已經能夠使用python 64的其他kernel32函數。這讓我瘋狂。
顯然,在x64 ABI中,['InterlockedExchange'](https://msdn.microsoft.com/en-us/library/ms683590)僅適用於編譯器內部函數['_InterlockedExchange'](https:// docs.microsoft.com/en-us/cpp/intrinsics/interlockedexchange-intrinsic-functions)。 – eryksun
順便說一下,對於Windows API,最好使用'kernel32 = ctypes.WinDLL('kernel32',use_last_error = True)'而不是'ctypes.windll.kernel32'。這樣可以避免在全局'windll'對象上緩存原型,並且還可以使ctypes保護WinAPI的最後一個錯誤值。在這種情況下,最後一個錯誤值可以通過'ctypes.get_last_error()'得到,你可以通過'ctypes.set_last_error(value)'預先設置它。對於失敗的調用,通過'raise ctypes.WinError(ctypes.get_last_error())'引發異常。 – eryksun
@eryksun感謝您的評論。我想我可以創建一個只是InterlockedExchange的包裝的DLL並使用它? –