4

ctypes の使用に問題がある

次のインターフェースを持つtestdllがあります

extern "C"
{
    // Returns a + b
    double Add(double a, double b);
    // Returns a - b
    double Subtract(double a, double b);
    // Returns a * b
    double Multiply(double a, double b);
    // Returns a / b
    double Divide(double a, double b);
}

私は .def ファイルも持っているので、「本当の」名前を持っています

LIBRARY "MathFuncsDll"
EXPORTS

 Add
 Subtract
 Multiply
 Divide

ctype を介して dll から関数を読み込んでアクセスできますが、パラメーターを渡すことができません。Python の出力を参照してください。

>>> from ctypes import *
>>> x=windll.MathFuncsDll
>>> x
<WinDLL 'MathFuncsDll', handle 560000 at 29e1710>
>>> a=c_double(2.12)
>>> b=c_double(3.4432)
>>> x.Add(a,b)

Traceback (most recent call last):
  File "<pyshell#76>", line 1, in <module>
    x.Add(a,b)
ValueError: Procedure probably called with too many arguments (16 bytes in excess)
>>> 

しかし、パラメーターなしで関数を追加できますか?!?!?!?!

>>> x.Add()
2619260

誰かが私を正しい方向に向けることができますか? 他のdllから関数を呼び出すことができるので、明らかなことを忘れていると思います(例:kernel32)

4

1 に答える 1

8

ctypesは、特に指定しない限り、パラメーターと戻り値を想定intして型を指定します。エクスポートされた関数は通常、WinDLL ではなく、C 呼び出し規則 (ctypes の CDLL) にデフォルト設定されます。これを試して:pointerint

from ctypes import *
x = CDLL('MathFuncsDll')
add = x.Add
add.restype = c_double
add.argtypes = [c_double,c_double]
print add(1.0,2.5)

出力

3.5
于 2012-04-06T20:39:31.870 に答える