我试图在64位python应用程序中使用kernel32中的InterlockedExchange。
这是我理想的工作代码:
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位python 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
我已经尝试了几种不同的方法来从python 64访问InterlockedExchange,所有这些似乎都遇到了同样的问题。我已经能够使用python 64中的其他kernel32函数了。这让我发疯了。
答案 0 :(得分:0)
我现在最终不需要这个,但我能够为InterlockedExchange创建一个包装器dll并从64进程成功使用它。