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 >>>
See About this document... for information on suggesting changes.