选择ctypes dll加载机制

时间:2018-04-25 07:16:14

标签: python windows ctypes loadlibrary

我正在研究一些可以使用ctypes访问某些dll功能的代码。库加载完成:

d3.select(selector).datum({
  startAngle: startAngle,
  endAngle: endAngle
})
.transition()
.delay(i * duration == 0 ? 0 : i * duration - 150)
.duration(duration)
.attrTween('d', d => {
  var interpolate = d3.interpolate(d.startAngle, d.endAngle - 0.03);
  return function(t) {
    d.endAngle = interpolate(t);
    return arc(d);
  };
});

这是在原始开发人员Windows 10机器(和其他人)中工作的。但是在我自己的机器上,我在调用库方法时遇到了这个错误:

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

谷歌搜索后我可以修复它将dll加载方法更改为:

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

这适用于我自己的Windows 10机器(以及其他机器)。但它在原始的Windows 10机器中不起作用,我们在调用库方法时会遇到另一个错误:

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

有没有办法以编程方式知道何时使用Procedure probably called with too many arguments (24 bytes in excess) 以及何时使用cdll.LoadLibrary

这是一个麻烦的代码,对windll.LoadLibrary的调用抛出了注释异常

o_session

我们使用的Python版本是3.4.0(32位)

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))

我的ctypes版本是1.1.0。

0 个答案:

没有答案