Выбор механизма загрузки ctypes dll - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над кодом, который может получить доступ к некоторой функциональности dll с помощью ctypes. Загрузка библиотеки была выполнена с помощью:

U2_C_INTERFACE = ctypes.cdll.LoadLibrary("mydllname")

И это работало на первоначальном компьютере разработчика Windows 10 (и других). Но на моей собственной машине я получил эту ошибку при вызове библиотечных методов:

Procedure called with not enough arguments (24 bytes missing) or wrong calling convention

После поиска в Google я могу исправить это, изменив метод загрузки DLL на:

U2_C_INTERFACE = ctypes.windll.LoadLibrary("mydllname")

Это работает на моем собственном компьютере с Windows 10 (и других). Но это не работает на исходном компьютере с Windows 10, мы получаем эту другую ошибку при вызове библиотечных методов:

Procedure probably called with too many arguments (24 bytes in excess)

Есть ли способ программно узнать, когда использовать cdll.LoadLibrary и когда windll.LoadLibrary?

Это проблемный код, вызов o_session вызывает закомментированное исключение

if U2_C_INTERFACE is None:
    # U2_C_INTERFACE = ctypes.cdll.LoadLibrary("uvic32")
    U2_C_INTERFACE = ctypes.windll.LoadLibrary("uvic32")

subkey  = c_char_p(bytes(0))
status  = c_long(0)
host_l  = bytes(servidor_uv,    servidor_universe.devolver_sistema_codificacion())
user_l  = bytes(usuario_uv,     servidor_universe.devolver_sistema_codificacion())
pass_l  = bytes(password_uv,    servidor_universe.devolver_sistema_codificacion())
acc_l   = bytes(cuenta_uv,      servidor_universe.devolver_sistema_codificacion())

# Gestión de apertura de sesión
o_session = U2_C_INTERFACE.ic_universe_session

o_session.argtypes = (
    c_char_p, c_char_p, c_char_p,
    c_char_p, c_char_p, _ctypes.POINTER(c_long))
res = o_session(
    c_char_p(host_l), c_char_p(user_l), c_char_p(pass_l),
    c_char_p(acc_l), subkey, _ctypes.byref(status))

Используемая версия Python - 3.4.0 (32 бита)

Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (Intel)] on win32

Моя версия ctypes - 1.1.0.

...