<p>确保定义与<code>ctypes</code>一起使用的函数的<code>.argtypes</code>和<code>.restype</code><code>GetModuleHandleA</code>取<code>LPCSTR</code>(相当于Python中的<code>bytes</code>对象),而<code>GetModuleHandleW</code>取<code>LPCWSTR</code>(相当于Python中的<code>str</code>对象)。此外,它们都返回<code>HDMODULE</code>,这是64位系统的64位值,但如果未指定,则默认<code>.restype</code>为<code>c_int</code>(32位)</p>
<p>以下是调用任一版本的正确代码:</p>
<pre class="lang-py prettyprint-override"><code>import ctypes as ct
from ctypes import wintypes as w
k32 = ct.WinDLL('kernel32')
k32.GetModuleHandleA.argtypes = w.LPCSTR,
k32.GetModuleHandleA.restype = w.HMODULE
k32.GetModuleHandleW.argtypes = w.LPCWSTR,
k32.GetModuleHandleW.restype = w.HMODULE
wmi = ct.WinDLL('wmi')
print(k32.GetModuleHandleA(b'wmi')) # byte string
print(k32.GetModuleHandleW('wmi')) # Unicode string
print(k32.GetModuleHandleA('wmi')) # calling with wrong type
</code></pre>
<p>下面是示例输出。注意:该值大于32位值所能容纳的值(>;4294967295),如果未设置<code>.restype</code>,则该值将被截断且不正确,如果未设置<code>.argtypes</code>,则不会出现错误消息</p>
<pre class="lang-none prettyprint-override"><code>1864530853888
1864530853888
Traceback (most recent call last):
File "C:\test.py", line 15, in <module>
print(k32.GetModuleHandleA('wmi'))
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
</code></pre>