14.14.1.2 Accessing functions from loaded dlls
Functions are accessed as attributes of dll objects:
>>> from ctypes import *
>>> libc.printf
<_FuncPtr object at 0x...>
>>> print windll.kernel32.GetModuleHandleA # doctest: +WINDOWS
<_FuncPtr object at 0x...>
>>> print windll.kernel32.MyOwnFunction # doctest: +WINDOWS
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ctypes.py", line 239, in __getattr__
func = _StdcallFuncPtr(name, self)
AttributeError: function 'MyOwnFunction' not found
>>>
Note that win32 system dlls like kernel32 and user32 often
export ANSI as well as UNICODE versions of a function. The UNICODE
version is exported with an W appended to the name, while the ANSI
version is exported with an A appended to the name. The win32
GetModuleHandle function, which returns a module handle for a
given module name, has the following C prototype, and a macro is used
to expose one of them as GetModuleHandle depending on whether
UNICODE is defined or not:
/* ANSI version */
HMODULE GetModuleHandleA(LPCSTR lpModuleName);
/* UNICODE version */
HMODULE GetModuleHandleW(LPCWSTR lpModuleName);
windll does not try to select one of them by magic, you must
access the version you need by specifying GetModuleHandleA or
GetModuleHandleW explicitely, and then call it with normal strings
or unicode strings respectively.
Sometimes, dlls export functions with names which aren't valid Python
identifiers, like "??2@YAPAXI@Z" . In this case you have to use
getattr to retrieve the function:
>>> getattr(cdll.msvcrt, "??2@YAPAXI@Z") # doctest: +WINDOWS
<_FuncPtr object at 0x...>
>>>
On Windows, some dlls export functions not by name but by ordinal.
These functions can be accessed by indexing the dll object with the
ordinal number:
>>> cdll.kernel32[1] # doctest: +WINDOWS
<_FuncPtr object at 0x...>
>>> cdll.kernel32[0] # doctest: +WINDOWS
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ctypes.py", line 310, in __getitem__
func = _StdcallFuncPtr(name, self)
AttributeError: function ordinal 0 not found
>>>
Release 2.5.2, documentation updated on 21st February, 2008.
See About this document... for information on suggesting changes.
|