Ошибки аргументов python ctypes

Я написал тестовую dll на С++, чтобы убедиться, что все работает до того, как я начну использовать более важную DLL, которая мне нужна. В основном он принимает два двойника и добавляет их, а затем возвращает результат. Я играл с другими функциями тестирования, и у меня есть результаты на работе, я просто не могу передать аргумент из-за ошибок. Мой код:

import ctypes
import string

nDLL = ctypes.WinDLL('test.dll')
func = nDLL['haloshg_add']
func.restype = ctypes.c_double
func.argtypes = (ctypes.c_double,ctypes.c_double)
print(func(5.0,5.0))

Он возвращает ошибку для строки, называемой func:

ValueError: Procedure probably called with too many arguments (8 bytes in excess)

Что я делаю неправильно? Спасибо.

Ответы

Ответ 1

Вероятно, вы перепутали вызывающие соглашения. Я предполагаю, что у вас функция C объявлена ​​примерно так:

double haloshg_add(double d1, double s2)
{
    return d1+d2;
}

По умолчанию используется соглашение о вызове C. Самый простой способ - изменить соглашение о вызове в коде ctypes:

nDLL = ctypes.CDLL('test.dll')

Если вы хотите изменить соглашение вызова в коде C на stdcall (чтобы соответствовать ctypes.WinDLL), вы должны сделать следующее:

double __stdcall haloshg_add(double d1, double s2)

Что бы вы ни делали, сделайте одно из этих изменений. Если вы сделаете оба, у вас будет обратный сбой!

Если бы это был я, я бы просто изменил код Python на использование соглашения о вызове C (используйте CDLL). Это изменение имеет наименьшее влияние.