作者cobrasgo (体重突破所有均线)
看板Python
标题Re: [问题] ctype注册callback function
时间Fri Jan 28 00:19:51 2011
※ 引述《sbrhsieh (偶尔想摆烂一下)》之铭言:
: ※ 引述《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 型别资讯。
请问一下这段知识是从哪里看到的啊?
我也很想了解python稍为底层的东西
总是觉得不知从何下手
直接看source code?
: : 但是还有两个问题
: : 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。
我刚刚试
果然那个error不见了
但另一个error又跑出来
不过解掉了
明天再贴完整且没error的code跟大家分享
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.25.185.67
※ 编辑: cobrasgo 来自: 114.25.185.67 (01/28 00:20)