2017-09-21 120 views
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函數。這讓我瘋狂。

+0

顯然,在x64 ABI中,['InterlockedExchange'](https://msdn.microsoft.com/en-us/library/ms683590)僅適用於編譯器內部函數['_InterlockedExchange'](https:// docs.microsoft.com/en-us/cpp/intrinsics/interlockedexchange-intrinsic-functions)。 – eryksun

+0

順便說一下,對於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

+0

@eryksun感謝您的評論。我想我可以創建一個只是InterlockedExchange的包裝的DLL並使用它? –

回答

0

我結束了現在不需要這個,但我能夠爲InterlockedExchange創建一個包裝DLL並從64進程成功使用它。

相關問題