ctypesの三つのロード方法

ctypesではDLLのロード方法が三つある。
cdll、windll、oledllの三つだが、その違いはcallされた時のスタックの扱いと、戻り値だ。
ややっこしいのでまとめてみる。

cdllで呼び出すべき関数

  • cdecl呼び出し規約に従う
  • intを返す

windllで呼び出すべき関数

  • stdcall呼び出し規約に従う
  • intを返す

oledllで呼び出すべき関数

  • stdcall呼び出し規約に従う
  • HRESULTを返す

cdeclとstdcallの違いは、Wikipediaが詳しい。

要は、引数をスタックにpushして関数を呼び出すのは同じだが、そのスタックを元に戻す責任があるのが、呼び出された関数側なのか、呼び出した側なのかの違い。