我正在尝试使用 ctypes 访问自定义 DLL。此 DLL 中有几个函数,除此特定函数之外的所有函数在使用 WinDLL 调用过程调用时都可以工作。
我创建了一个单独的 Python 函数,它基本上环绕
s = ctypes.WinDLL(r'MyDLL.dll')
def setupOptions(window_area, MinimumRunTime, IGU_Flag, InnerPaneStopFlag,
mass_1, x_GlassFail_1, x_WinFail_1,
mass_2=0, x_GlassFail_2=0, x_WinFail_2=0, x_gap=0,
MaxSteps=10000, MaxNumCycles=2, supp_coeff=0.40528,
FailVelocityFactor=1.0, P_atm=14.7,
time_step=0.01, z=0.2, InitialStaticLoad=0.0,
x_initial_1=0.0, Initial_Velocity_1=0.0,
x_initial_2=0.0, Initial_Velocity_2=0.0):
# Flag identifying whether the window is an IGU or not
apiIGUFlag = c_long(IGU_Flag)
apiInnerPaneStopFlag = c_long(InnerPaneStopFlag)
# Percentage of critical damping
z = c_double(z)
# Timestep (this can be increased - didn't spend the time to calculate it)
time_step = c_double(time_step)
# Initial Conditions
InitialStaticLoad = c_double(InitialStaticLoad)
x_initial_1 = c_double(x_initial_1)
Initial_Velocity_1 = c_double(Initial_Velocity_1)
x_initial_2 = c_double(x_initial_2)
Initial_Velocity_2 = c_double(Initial_Velocity_2)
# Failure Values
x_GlassFail_1 = c_double(x_GlassFail_1)
x_WinFail_1 = c_double(x_WinFail_1)
x_GlassFail_2 = c_double(x_GlassFail_2)
x_WinFail_2 = c_double(x_WinFail_2)
# Environment parameters
P_atm = c_double(P_atm)
FailVelocityFactor = c_double(FailVelocityFactor)
supp_coeff = c_double(supp_coeff)
# Other Parameters
window_area = c_double(window_area)
x_gap = c_double(x_gap)
# Model Parameters
apiMaxSteps = c_long(MaxSteps)
apiMaxNumCycles = c_long(MaxNumCycles)
mass_1 = c_double(mass_1)
mass_2 = c_double(mass_2)
MinimumRunTime = c_double(MinimumRunTime)
return s.api_SetupWindowOptions(apiIGUFlag, apiInnerPaneStopFlag, z, time_step, InitialStaticLoad, apiMaxSteps,
apiMaxNumCycles, x_initial_1, Initial_Velocity_1, mass_1, x_GlassFail_1,
x_WinFail_1, x_initial_2, Initial_Velocity_2, mass_2, x_GlassFail_2,
x_WinFail_2, x_gap, window_area, supp_coeff, P_atm, FailVelocityFactor, MinimumRunTime)
这是调用的函数:
area = 2040.0
xgap = 0.5
mass1 = 51.26
mass2 = 51.26
xGlassFail1 = 0.970
xGlassFail2 = 0.750
xWinFail1 = 0.970
xWinFail2 = 9.18
IGUFLAG = 1
minruntime = 52.0
ret = setupOptions(area, minruntime, IGUFLAG, IGUFLAG, mass1, xGlassFail1, xWinFail1, mass2, xGlassFail2, xWinFail2, xgap)
运行代码时出现此错误:
ValueError: Procedure probably called with too many arguments (8 bytes in excess)
就像我说的,我在这个 DLL 中调用了其他几个函数并且没有任何问题。我尝试使用 CDLL,但这也会导致问题(短 160 字节)。任何帮助将不胜感激,因为我已经全面查看了这一切,根本看不出问题出在哪里。
这里还有来自 C++ 头文件的函数调用:
MyDLL_API long _stdcall api_SetupWindowOptions(long nIsIGU, long nInnerPaneStopCriteriaOnly, double dCritDampingPercent, double dTimeStep, double dStaticLoad, long nMaxSteps, long nMaxNumCycles,
double dInitialDisplacementInnerPane, double dInitialVelocityInnerPane, double dMassInnerPane,
double dGlassFailDeflInnerPane, double dWinFailDeflInnerPane, double dInitialDisplacementOuterPane, double dInitialVelocityOuterPane,
double dMassOuterPane, double dGlassFailDeflOuterPane, double dWinFailDeflOuterPane, double dGapSize, double dWindowArea,
double dSupportCoefficient, double dAtmPressure, double dFailVelocityFactor, double dMinimumRuntime);