ethanliang 發表於 13-3-8 11:55

各位前輩好,想請問關於群益報價API + VB 2012的問題…..
懇請有經驗的前輩指導一下,謝謝。

在修改過程中,曾經出現一個錯誤訊息,

Managed 偵錯助理 ’CallbackOnCollectedDelegate’偵測到
’D:\VBA\QuoteTicks\QuoteTicks\bin\Debug\QuoteTicks.vshost.exe’中發生問題。

其它資訊:已在型別 ’QuoteTicks!QuoteTicks.Form1+FOnNotifyTicks::Invoke’
的記憶體回收委派上進行回呼,這樣可能導致應用程式無法運作、毀損、或遺失資料,傳遞委派到Unmanaged程式碼時,必須由Managed應用程式讓它們保持運作,直到確定不會再呼叫它們為止。

sunny 發表於 13-3-8 14:30

本帖最後由 sunny 於 13-3-8 14:34 編輯

您為何這麼執著用 VB 2012 來開發呢?
我記得沒錯的話這群益釋放出來的 API 報價元件是用 Delphi 開發的,
這已經是很古董的程式語言了, 有 10 年以上了吧,
我自己是用 VB 6 來開發包裝,
是沒有遇到您說的問題,
但是他報價的速度(我的環境和經驗, 別人不一定)其實還是
比其他看盤軟體慢一些 ( 0.4 ~ 1 秒 看當時環境而定 ),
不過是有比 DDE 快一點然後較穩定啦 ( 策略王在快市時 Delay 他不會),
他的範例也都是當時寫的,
所以用以前的語言版本應該都很好開發,
所以建議您改用 VB 6 來開發比較不會卡在這裡,
浪費太多時間在這裡到不如去用 DDE 就好了,
因為他的程式有用到 CallBack 架構,
如果真需要用 VB 2012 開發較特別功能的話,
要解決您遇到的問題的話就要去
了解 VB 2012 如何使用 CallBack 架構,
去查查 ICallbackEventHandler 介面也許會有幫助,
Good Luck ~

ethanliang 發表於 13-3-8 17:47

sunny 發表於 13-3-8 14:30 static/image/common/back.gif
您為何這麼執著用 VB 2012 來開發呢?
我記得沒錯的話這群益釋放出來的 API 報價元件是用 Delphi 開發的,
這 ...

sunny兄您好:請問,我用VB 2012程式碼與呼叫順序,在VB6的環境,是否還有其它需要修正的部分?謝謝 !

sunny 發表於 13-3-8 18:07

本帖最後由 sunny 於 13-3-8 18:10 編輯

ethanliang 發表於 13-3-8 17:47 static/image/common/back.gif
sunny兄您好:請問,我用VB 2012程式碼與呼叫順序,在VB6的環境,是否還有其它需要修正的部分?謝謝 !...
我不可能一行一行去看您的程式,
不知您有程式設計的基楚嗎,
如果有的話, 您拿他在 VBA 內的程式,是 Excel 範例喔, 不是您轉過的程式喔 !
用在 VB 6 基本上是沒有問題的,
有出錯的地方從訊息說明再改一下就可以了,
我的程式五年前就寫了,
我也要去找找原始碼才行,
您用 VB 6 跑跑,
有錯再貼出來,
可以一起討論幫忙解決 ~




pazival01 發表於 13-3-8 19:05

C#沒有遇過這一類型的問題ㄝ

VB有跟C# 一樣有try{ } catch{}的 function嗎?

這個能ctach出是在哪一行掛點的....

jeffrey 發表於 13-3-8 19:23

我用 VB.NET 也沒發生這些問題
考慮 NET 以後有 64 bit 才選它的
在64bit OS 跑時, 速度效能會快過 32bit 程式很多

ethanliang 發表於 13-3-8 23:24

sunny 發表於 13-3-8 18:07 static/image/common/back.gif
我不可能一行一行去看您的程式,
不知您有程式設計的基楚嗎,
如果有的話, 您拿他在 VBA 內的程式,是 Excel...

sunny兄 您好:不好意思,我的程式設計基礎薄弱,最近才買書自修VB.NET,所以,VB6 可以說是完全陌生,也缺VB6安裝軟體,請問有免費下載 VB6的地方嗎 ?謝謝!

ethanliang 發表於 13-3-8 23:27

jeffrey 發表於 13-3-8 19:23 static/image/common/back.gif
我用 VB.NET 也沒發生這些問題
考慮 NET 以後有 64 bit 才選它的
在64bit OS 跑時, 速度效能會快過 32bit...

jeffrey兄 您好:請問您用的VB.NET是哪一個版本?2005 or 2008 or 2010 or 2012?也是在Win7 環境下執行嗎 ?謝謝 !

ethanliang 發表於 13-3-8 23:32

pazival01 發表於 13-3-8 19:05 static/image/common/back.gif
C#沒有遇過這一類型的問題ㄝ

VB有跟C# 一樣有try{ } catch{}的 function嗎?


pazival01兄 您好:VB也有 try catch的功能,我有試過,可能是我的程式底子太差,所以,試了一個多月,還是無法克服 4分鐘的魔咒,實在很懊惱。

ethanliang 發表於 13-3-11 08:03

jeffrey 發表於 13-3-8 19:23 static/image/common/back.gif
我用 VB.NET 也沒發生這些問題
考慮 NET 以後有 64 bit 才選它的
在64bit OS 跑時, 速度效能會快過 32bit...

jeffrey兄您好:請問您,如何將群益的config.ini、SKQuoteLib.dll檔,加入VB.NET ?謝謝。 我一直無法把這2個檔加入『方案總管』內,只好直接複製貼到 /bin/Debug/內,不知這種做法是否OK ?

ethanliang 發表於 13-3-12 20:42

sunny 發表於 13-3-8 18:07 static/image/common/back.gif
我不可能一行一行去看您的程式,
不知您有程式設計的基楚嗎,
如果有的話, 您拿他在 VBA 內的程式,是 Excel...

sunny兄,您好: 依您所建議,我用群益VBA內的程式,在VB6跑,有出現一個問題:『 編輯錯誤:AddressOf 運算子的用法不正確 』 我試了很多種可能的組合,還是無法突破,麻煩您,幫我看看,如何修改 ? 謝謝。 片段程式碼如下: OptionExplicit 宣告區Private Declare FunctionSKQuoteLib_AttachConnectionCallBack Lib "SKQuoteLib.dll" (ByVal FuncAs Long) As Long 呼叫區 status = status +SKQuoteLib_AttachConnectionCallBack(AddressOf OnConnectionBack)

sunny 發表於 13-3-13 01:46

... Function SKQuoteLib .... 要有空格喔,
其他的有照貼嗎?

ethanliang 發表於 13-3-13 12:45

sunny 發表於 13-3-13 01:46 static/image/common/back.gif
... Function SKQuoteLib .... 要有空格喔,
其他的有照貼嗎?

sunny兄,您好: VB6 程式碼如下,執行時會發生AddressOf 運算子的用法不正確(如紅色字)請幫我看看,謝謝。 Option Explicit '*** 宣告DLLPrivate Declare FunctionSKQuoteLib_Initialize Lib"SKQuoteLib.dll" (ByVal strID As String, ByVal strPass As String) AsLongPrivate Declare FunctionSKQuoteLib_EnterMonitor Lib"SKQuoteLib.dll" () As LongPrivate Declare FunctionSKQuoteLib_AttachConnectionCallBack Lib"SKQuoteLib.dll" (ByVal Func As Long) As LongPrivate Declare FunctionSKQuoteLib_AttachTicksCallBack Lib"SKQuoteLib.dll" (ByVal Func As Long) As LongPrivate Declare FunctionSKQuoteLib_RequestTicks Lib"SKQuoteLib.dll" (ByRef Page As Integer, ByVal Stock As String) AsLongPrivate Declare FunctionSKQuoteLib_GetTick Lib"SKQuoteLib.dll" (ByVal Market As Integer, ByVal Index As Integer,ByVal Ptr As Long, ByRef Tick As TTick) As Long '*** 定義TTick結構Private Type TTickPtr AsLongTime As LongBid As LongAsk As LongClose As LongQty As LongEnd Type '*** 呼叫DLL Public Function Login(ByVal AcNo As String,ByVal Pwd As String) As Integer     Dim status As Long    status = status + SKQuoteLib_Initialize(AcNo,Pwd)    status = status +SKQuoteLib_AttachConnectionCallBack(AddressOfOnConnectionBack)    status = status +SKQuoteLib_AttachTicksCallBack(AddressOf OnTicks)       If status = 0 Then      status = SKQuoteLib_EnterMonitor()      Login = 0    Else:      Login = -1    End If    End Function '*** 接收ConnectionCallBackSub OnConnectionBack(ByValkind As Long, ByVal code As Long)    If code = 0 Then      MsgBox "報價伺服器登入成功!!"    Else      MsgBox "報價中斷!!"      EndIf End Sub '** 接收Tick報價 Sub OnTicks(ByVal MarketNo As Integer, ByValIndex As Integer, ByVal Ptr As Long)        Dim status As Long    Dim Tick As TTick       status = SKQuoteLib_GetTick(MarketNo, Index,Ptr, Tick)    txtPtr.Text = Tick.Ptr   txtTime.Text = Tick.Time   txtBid.Text = Tick.Bid   txtAsk.Text = Tick.Ask   txtClose.Text = Tick.Close   txtQty.Text = Tick.QtyEnd Sub '** 登入帳號密碼按鈕Private SubbtnCheckin_Click() Dim Rn As Integer    Rn = Login("身分證字號", "密碼")    If Rn = 0 Then      MsgBox "登入成功"    Else      MsgBox "登入失敗!!"    End If End Sub '** 開始接收報價按鈕Private Sub btnQuote_Click()    Dim ComIds As String   Dimstatus As Long   ComIds= "TX00"   status= SKQuoteLib_RequestTicks(-1, ComIds) End Sub

sunny 發表於 13-3-13 16:40

我貼上 VB6 跑不會出現 AddressOf 的問題,,
有問題的是您有些字連在一起, 把他分開即可,
記得這些宣告都要放在 "模組" 喔,
Sub btnCheckin_Click() 和 Sub btnQuote_Click() 可以放在表單的程式碼內,
妳下載的範例程式有沒有一個 SKQuote.exe 呢?
先執行那個看看是否 Work , 不然不知是否開通 ~

ethanliang 發表於 13-3-13 19:25

sunny 發表於 13-3-13 16:40 static/image/common/back.gif
我貼上 VB6 跑不會出現 AddressOf 的問題,,
有問題的是您有些字連在一起, 把他分開即可,
記得這些宣告都要 ...

sunny兄,您好:1. SKQuote.exe 有試過,已開通。2. 您說把宣告放在『模組』裡?    請問模組所用的程式碼是哪個指令 ? 3. 我修正後的程式碼,還是會產生AddressOf問題,    請您再幫我看看,謝謝。 更新後程式碼如下: Option Explicit '*** 宣告DLLPrivate Declare FunctionSKQuoteLib_InitializeLib"SKQuoteLib.dll" (ByVal strID As String,ByVal strPass As String) As LongPrivate Declare FunctionSKQuoteLib_EnterMonitorLib"SKQuoteLib.dll" () As LongPrivate Declare FunctionSKQuoteLib_AttachConnectionCallBackLib"SKQuoteLib.dll" (ByVal FuncAs Long) As LongPrivate Declare FunctionSKQuoteLib_AttachTicksCallBackLib"SKQuoteLib.dll" (ByVal Func AsLong) As LongPrivate Declare FunctionSKQuoteLib_RequestTicksLib"SKQuoteLib.dll" (ByRef Page As Integer,ByVal Stock As String) As LongPrivate Declare FunctionSKQuoteLib_GetTick Lib "SKQuoteLib.dll" (ByVal Market As Integer,ByVal Index As Integer, ByVal Ptr As Long, ByRef Tick As TTick) As Long '*** 定義TTick結構Private Type TTickPtr As LongTime As LongBid As LongAsk As LongClose As LongQty As LongEnd Type '*** 呼叫DLL Public Function Login(ByVal AcNo As String,ByVal Pwd As String) As Integer     Dim status As Long    status = status +SKQuoteLib_Initialize(AcNo, Pwd)    status = status + SKQuoteLib_AttachConnectionCallBack(AddressOfOnConnectionBack)    status = status +SKQuoteLib_AttachTicksCallBack(AddressOf OnTicks)       If status = 0 Then      status = SKQuoteLib_EnterMonitor()      Login = 0    Else:      Login = -1    End If    End Function '*** 接收ConnectionCallBackSub OnConnectionBack(ByValkind As Long, ByVal code As Long)      If code = 0 Then      MsgBox "報價伺服器登入成功!!"    Else      MsgBox "報價中斷!!"      End If End Sub '** 接收 Tick報價 Sub OnTicks(ByVal MarketNo As Integer, ByValIndex As Integer, ByVal Ptr As Long)        Dim status As Long    Dim Tick As TTick       status = SKQuoteLib_GetTick(MarketNo,Index, Ptr, Tick)   txtPtr.Text = Tick.Ptr   txtTime.Text = Tick.Time   txtBid.Text = Tick.Bid   txtAsk.Text = Tick.Ask   txtClose.Text = Tick.Close   txtQty.Text = Tick.QtyEnd Sub Private Sub Form_Load() '** 登入帳號密碼   Dim Rn As Integer    Rn = Login("身分證字號", "密碼")    If Rn = 0 Then      MsgBox "登入成功"    Else      MsgBox "登入失敗!!"    End If '** 開始接收報價   Dim ComIds As String   Dim status As Long   ComIds = "TX00"   status = SKQuoteLib_RequestTicks(-1, ComIds) End Sub
頁: 1 [2] 3 4 5 6
查看完整版本: 請問關於群益報價API + VB 2012的問題