可以使用32位但不是64位的ctypes访问某些kernel32函数

时间:2017-09-21 08:36:08

标签: windows python-3.x 64-bit ctypes kernel32

我试图在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函数了。这让我发疯了。

1 个答案:

答案 0 :(得分:0)

我现在最终不需要这个,但我能够为InterlockedExchange创建一个包装器dll并从64进程成功使用它。

相关问题