看板 Python 關於我們 聯絡資訊
※ 引述《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)
cobrasgo:官網的那個我之前就有看過,也參考了。不過還是不work 01/25 21:27
cobrasgo:另外我確定程式已經有進行到register callback,因為回 01/25 21:28
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)
cobrasgo:我眼殘了…拍謝,好像還要call另一個function,callback 01/25 22:01
cobrasgo:才會被呼叫囧 01/25 22:01