作者sbrhsieh (偶尔想摆烂一下)
看板Python
标题Re: [问题] ctype注册callback function
时间Thu Jan 27 20:36:30 2011
※ 引述《cobrasgo (体重突破所有均线)》之铭言:
: 另外之前试不起来的主因是这行
: CMPFUNC = CFUNCTYPE(c_int, comtypes.BSTR)
: 就是create ctype的callback function时
: 它应该是会去检查这个type对不对
: 我把参数那栏改成comtypes.BSTR之後
: 就可以work了
: 我想简单的说就是它对参数的格式
: 检查很严格吧
透过 CFUNCTYPE/WINFUNCTYPE 来建立 function wrapper type 时不会检查 formal
parameter 的型别,而是指定的 formal parameter 型别会决定 wrapper function
如何处理 actual arguments 与如何传递给 wrapped function。
把一个 Python function/callable wrapping 成 function wrapper type(比如
上述的 CMPFUNC)时,也不会检查型别,因为 Python function 的 formal parameter
在 Python level 没有 compile-time 型别资讯。
: 但是还有两个问题
: 1) 有error
: Traceback (most recent call last):
: File "_ctypes/callbacks.c", line 320, in 'converting callback result'
: TypeError: an integer is required
: Exception in <bound method qyAPI._oiCallback of <__main__.qyAPI instance
: at 0x00EE8C88>> ignored
: Traceback (most recent call last):
: File "C:\qy\2.1.5\ctypes\qyAgent.py", line 81, in go
: self._GetUserAccount()
: ValueError: Procedure probably called with too many arguments (942000 bytes
: in excess)
: 官网上对这个error的说法是1)错误的参数个数,或是2)错误的calling convention
: 应该是第二个wrong calling convention
: 但是这个我就没有想法了囧
以参数过多来看,你使用的套件(DLL)应该是以 __stdcall 方式来调用注册的
callback function,那麽你在定义 wrapper function type 时,应使用
WINFUNCTYPE。
CMPFUNC =
WINFUNCTYPE(c_int, comtypes.BSTR)
後来实际去 download 你提供的 API 文件来看,这个 DLL 实际上是一个 COM
object 的实作,或许你可以考虑在你的 Python runtime 上安装 pywin32 套件
或是直接安装有内建(整合) pywin32 的 Python implementation(如 ActiveState
出品的 ActivePython),以操作 COM object 的方式来使用该 DLL。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.174.5
※ 编辑: sbrhsieh 来自: 220.136.174.5 (01/27 20:38)
※ 编辑: sbrhsieh 来自: 220.136.174.5 (01/27 21:03)