python - Valg af ctypes dll indlæsningsmekanisme

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på en kode, der kan få adgang til nogle dll funcionality ved hjælp af ctypes. Bibliotekets indlæsning blev udført med:


U2\_C\_INTERFACE = ctypes.cdll.LoadLibrary("mydllname")


Og dette arbejdede i den oprindelige udvikler Windows 10-maskine (og andre). Men på min egen maskine fik jeg denne fejl ved at kalde biblioteksmetoder:


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


Efter googling kunne jeg ordne det ved at ændre dll loading metode til:


U2\_C\_INTERFACE = ctypes.windll.LoadLibrary("mydllname")


Dette virker i min egen Windows 10 maskine (og andre). Men det virker ikke i den oprindelige Windows 10-maskine, vi får denne anden fejl, når vi kalder biblioteksmetoder:


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


Er der en måde at vide programmatisk, når du skal bruge cdll.LoadLibrary og når windll.LoadLibrary?


Dette er den plagsomme kode, og opkaldet til o\_session kaster den kommenterede undtagelse


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-versionen vi bruger er 3.4.0 (32 bit)


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


Min ctypes version er 1.1.0.

Bedste reference