動的リンクライブラリをロードするために、ctypesはcdllをエクスポートします。
Windowsではさらにwindllとoledllオブジェクトもエクスポートします。
これらのオブジェクトの属性としてライブラリにアクセスすることでライブラリをロードします。
cdllは標準cdecl呼び出し規約を用いて関数をエクスポートしているライブラリをロードします。
それに対して、windllライブラリはstdcall呼び出し規約を用いる関数を呼び出します。
oledllもstdcall呼び出し規約を使いますが、関数がWindows HRESULTエラーコードを
返すことを想定しています。このエラーコードは関数呼び出しが失敗したとき、
WindowsError Python例外を自動的に発生させるために使われます。
Windows用の例ですが、msvcrtはほとんどの標準C関数が含まれているMS標準Cライブラリであり、
cdecl呼び出し規約を使うことに注意してください:
>>> from ctypes import * >>> print windll.kernel32 # doctest: +WINDOWS <WinDLL 'kernel32', handle ... at ...> >>> print cdll.msvcrt # doctest: +WINDOWS <CDLL 'msvcrt', handle ... at ...> >>> libc = cdll.msvcrt # doctest: +WINDOWS >>>
Windowsではいつもの'.dll'ファイル拡張子を自動的に追加します。
Linuxではライブラリをロードするために拡張子を含むファイル名を 指定する必要があるので、属性アクセスは動作しません。 dllローダーのLoadLibraryメソッドを使うか、 コンストラクタを呼び出してCDLLのインスタンスを作ることでライブラリを ロードするかのどちらかを行わなければなりません:
>>> cdll.LoadLibrary("libc.so.6") # doctest: +LINUX
<CDLL 'libc.so.6', handle ... at ...>
>>> libc = CDLL("libc.so.6") # doctest: +LINUX
>>> libc # doctest: +LINUX
<CDLL 'libc.so.6', handle ... at ...>
>>>
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。