Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
f1435100
Kaydet (Commit)
f1435100
authored
Haz 14, 2006
tarafından
Thomas Heller
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Document paramflags.
üst
83cc0d0a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
129 additions
and
21 deletions
+129
-21
libctypes.tex
Doc/lib/libctypes.tex
+129
-21
No files found.
Doc/lib/libctypes.tex
Dosyayı görüntüle @
f1435100
...
...
@@ -1615,6 +1615,9 @@ private class:
Base class for C callable foreign functions.
\end{classdesc*}
Instances of foreign functions are also C compatible data types; they
represent C function pointers.
This behaviour can be customized by assigning to special attributes of
the foreign function object.
...
...
@@ -1653,7 +1656,7 @@ Assign a Python function or another callable to this attribute.
The callable will be called with three or more arguments:
\end{memberdesc}
\begin{funcdescni}
{
callable
}{
result, func, arguments
, *others
}
\begin{funcdescni}
{
callable
}{
result, func, arguments
}
\code
{
result
}
is what the foreign function returns, as specified by the
\member
{
restype
}
attribute.
...
...
@@ -1668,13 +1671,15 @@ behaviour on the arguments used.
The object that this function returns will be returned from the
foreign function call, but it can also check the result value and
raise an exception if the foreign function call failed.
\code
{
others
}
will usually be an empty tuple, it is only used in
combination with
\var
{
paramflags
}
documented below.
\end{funcdescni}
Instances of foreign functions are also C compatible data types; they
represent C function pointers.
\begin{excdesc}
{
ArgumentError()
}
This exception is raised when a foreign function call cannot
convert one of the passed arguments.
\end{excdesc}
\subsubsection
{
Function prototypes
\label
{
ctypes-function-prototypes
}}
Foreign functions can also be created by instantiating function
prototypes. Function prototypes are similar to function prototypes in
...
...
@@ -1715,15 +1720,12 @@ Create a C callable function (a callback function) from a Python
\code
{
callable
}
.
\end{funcdescni}
\begin{funcdescni}
{
prototype
}{}{
name, library
\optional
{
, paramflags
}}
Returns a foreign function by looking up
\var
{
name
}
in the shared
library
\code
{
dll
}
.
\end{funcdescni}
\begin{funcdescni}
{
prototype
}{}{
ordinal, library
\optional
{
, paramflags
}}
Returns a foreign function which is exported by the ordinal number
\code
{
ordinal
}
in the shared library
\code
{
dll
}
. This mechanism only
exists on Windows.
\begin{funcdescni}
{
prototype
}{
func
_
spec
\optional
{
, paramflags
}}
Returns a foreign function exported by a shared library.
\code
{
func
{
\_
}
spec
}
must be a 2-tuple
\code
{
(name
{
\_
}
or
{
\_
}
ordinal, library)
}
.
The first item is the name of the exported function as string, or
the ordinal of the exported function as small integer. The second
item is the shared library instance.
\end{funcdescni}
\begin{funcdescni}
{
prototype
}{
vtbl
_
index, name
\optional
{
, paramflags
\optional
{
, iid
}}}
...
...
@@ -1738,14 +1740,120 @@ pointer to the COM interface as first argument, in addition to
those parameters that are specified in the
\member
{
argtypes
}
tuple.
\end{funcdescni}
XXX Document paramflags.
The optional
\var
{
paramflags
}
parameter creates foreign function
wrappers with much more functionality than the features described
above.
XXX Where does the exception description belong?
\var
{
paramflags
}
must be a tuple of the same length as
\member
{
argtypes
}
.
\begin{excdesc}
{
ArgumentError()
}
This exception is raised when a foreign function call cannot
convert one of the passed arguments.
\end{excdesc}
Each item in this tuple contains further information about a
parameter, it must be a tuple containing 1, 2, or 3 items.
The first item is an integer containing flags for the parameter.
\begin{datadescni}
{
1
}
Specifies an input parameter to the function.
\end{datadescni}
\begin{datadescni}
{
2
}
Output parameter. The foreign function fills in a value.
\end{datadescni}
\begin{datadescni}
{
4
}
Input parameter which defaults to the integer zero.
\end{datadescni}
The optional second item is the parameter name as string. If this is
specified, the foreign function can be called with named parameters.
The optional third item is the default value for this parameter.
This example demonstrates how to wrap the Windows
\code
{
MessageBoxA
}
function so that it supports default parameters and named arguments.
The C declaration from the windows header file is this:
\begin{verbatim}
WINUSERAPI int WINAPI
MessageBoxA(
HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType);
\end{verbatim}
Here is the wrapping with
\code
{
ctypes
}
:
\begin{quote}
\begin{verbatim}
>>> from ctypes import c
_
int, WINFUNCTYPE, windll
>>> from ctypes.wintypes import HWND, LPCSTR, UINT
>>> prototype = WINFUNCTYPE(c
_
int, HWND, LPCSTR, LPCSTR, c
_
uint)
>>> paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", None), (1, "flags", 0)
>>> MessageBox = prototype(("MessageBoxA", windll.user32), paramflags)
>>>
\end{verbatim}
\end{quote}
The MessageBox foreign function can now be called in these ways:
\begin{verbatim}
>>> MessageBox()
>>> MessageBox(text="Spam, spam, spam")
>>> MessageBox(flags=2, text="foo bar")
>>>
\end{verbatim}
A second example demonstrates output parameters. The win32
\code
{
GetWindowRect
}
function retrieves the dimensions of a specified
window by copying them into
\code
{
RECT
}
structure that the caller has to
supply. Here is the C declaration:
\begin{verbatim}
WINUSERAPI BOOL WINAPI
GetWindowRect(
HWND hWnd,
LPRECT lpRect);
\end{verbatim}
Here is the wrapping with
\code
{
ctypes
}
:
\begin{quote}
\begin{verbatim}
>>> from ctypes import POINTER, WINFUNCTYPE, windll
>>> from ctypes.wintypes import BOOL, HWND, RECT
>>> prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))
>>> paramflags = (1, "hwnd"), (2, "lprect")
>>> GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags)
>>>
\end{verbatim}
\end{quote}
Functions with output parameters will automatically return the output
parameter value if there is a single one, or a tuple containing the
output parameter values when there are more than one, so the
GetWindowRect function now returns a RECT instance, when called.
Output parameters can be combined with the
\member
{
errcheck
}
protocol to do
further output processing and error checking. The win32
\code
{
GetWindowRect
}
api function returns a
\code
{
BOOL
}
to signal success or
failure, so this function could do the error checking, and raises an
exception when the api call failed:
\begin{verbatim}
>>> def errcheck(result, func, args):
... if not result:
... raise WinError()
... return args
>>> GetWindowRect.errcheck = errcheck
>>>
\end{verbatim}
If the
\member
{
errcheck
}
function returns the argument tuple it receives
unchanged,
\code
{
ctypes
}
continues the normal processing it does on the
output parameters. If you want to return a tuple of window
coordinates instead of a
\code
{
RECT
}
instance, you can retrieve the
fields in the function and return them instead, the normal processing
will no longer take place:
\begin{verbatim}
>>> def errcheck(result, func, args):
... if not result:
... raise WinError()
... rc = args[1]
... return rc.left, rc.top, rc.bottom, rc.right
>>>
>>> GetWindowRect.errcheck = errcheck
>>>
\end{verbatim}
\subsubsection
{
Utility functions
\label
{
ctypes-utility-functions
}}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment