動的リンクライブラリをロードするために、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 ...> >>>
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。