作者sbrhsieh (偶尔想摆烂一下)
看板Python
标题Re: [问题] ctype注册callback function
时间Mon Jan 24 23:08:56 2011
※ 引述《cobrasgo (体重突破所有均线)》之铭言:
: 小弟目前在写程式呼叫期货商的API
: 但是碰到了问题
: 程式如下
: import ctypes
: from ctypes import *
: import traceback
: class qyAPI:
: [略]
: def _apiInit(self):
: try:
: self._qyAPI = windll.LoadLibrary(self._qyDllPath)
: self._SKOrderLib_Initialize = self._qyAPI.SKOrderLib_Initialize
: self._RegisterOnOpenInterestCallBack = self._qyAPI.RegisterOnOpenInterestCallBack
: #initialization
: ret = self._SKOrderLib_Initialize(self._account, self._passwd)
: print "init result is ", ret
: CMPFUNC = CFUNCTYPE(c_int, POINTER(c_char_p))
: cb = CMPFUNC(self._oiCallback)
: #register a callback to get open interest status
: ret = self._RegisterOnOpenInterestCallBack(addressof(cb))
: print "oi result is ", ret
: except:
: traceback.print_exc()
如果可以的话,请提供 RegisterOnOpenInterestCallBack 的 prototype。
先假设它的 prototype 大约如下(由你提供的码来看):
int RegisterOnOpenInterestCallBack(
int (__cdecl *callback)(char**)
);
self._RegisterOnOpenInterestCallBack = self._qyAPI.RegisterOnOpenInterestCallBack;
CMPFUNC = CFUNCTYPE(c_int, POINTER(c_char_p))
self._RegisterOnOpenInterestCallBack.argtypes = (CMPFUNC,)
self._RegisterOnOpenInterestCallBack.restype = c_int
cb = CMPFUNC(self._oiCallback)
ret = self._RegisterOnOpenInterestCallBack(cb)
但是下面的 call-back function implementation 是错的,应该要 return 整数值。
: def _oiCallback(self, returnString):
: print "_oiCallback start"
: print returnString
: print "_oiCallback end"
: qyAPI()
: raw_input()
: =================
: 呼叫RegisterOnOpenInterestCallBack这个function,需要传一个callback function
: 但是我这样写似乎是有问题的
: callback function并没有进去
: 请问我要register callback function的话
: 要怎麽写呢?
要先确定在测试时,程式已经进行到会使用你注册的 call-back function 的阶段。
另外,请看一下 Python 官网上 ctypes 文件的 callback function 教学。
http://docs.python.org/release/2.5.4/lib/ctypes-callback-functions.html
qsort:
http://msdn.microsoft.com/zh-tw/library/zes7xw0h.aspx
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.166.234.23
※ 编辑: sbrhsieh 来自: 118.166.234.23 (01/24 23:13)
1F:推 cobrasgo:官网的那个我之前就有看过,也参考了。不过还是不work 01/25 21:27
2F:→ cobrasgo:另外我确定程式已经有进行到register callback,因为回 01/25 21:28
3F:→ cobrasgo:传值是0 01/25 21:28
有成功 register callback function 不表示 registered callback function
就会被执行,必须要碰到可触发此 callback 的事件发生。
依照你下一篇的说明,成功注册(登记) OnOpenInterestCallBack function 後,
必须要有执行 GetOpenInterest function,已登记的对应 callback 才会被调用。
(我在你的推文前的最後一段话,就是指这个)
我在你提供的测试程式中没有看到有导致 GetOpenInterest 被调用的 statement,
即使登记 callback function 是成功的,你也不会观察到 callback function
对 standard output 所作的输出(因为 callback function 没有执行过)。
※ 编辑: sbrhsieh 来自: 118.166.234.23 (01/25 21:55)
4F:推 cobrasgo:我眼残了…拍谢,好像还要call另一个function,callback 01/25 22:01
5F:→ cobrasgo:才会被呼叫囧 01/25 22:01