COCO研究院

 找回密碼
 註冊
搜索
樓主: ethanliang

[API] 請問關於群益報價API + VB 2012的問題

[複製鏈接]
 樓主| 發表於 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應用程式讓它們保持運作,直到確定不會再呼叫它們為止。

發表於 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 ~
 樓主| 發表於 13-3-8 17:47 | 顯示全部樓層
sunny 發表於 13-3-8 14:30
您為何這麼執著用 VB 2012 來開發呢?
我記得沒錯的話這群益釋放出來的 API 報價元件是用 Delphi 開發的,
這 ...

sunny兄您好:
請問,我用VB 2012程式碼與呼叫順序,
在VB6的環境,是否還有其它需要修正的部分?
謝謝 !
發表於 13-3-8 18:07 | 顯示全部樓層
本帖最後由 sunny 於 13-3-8 18:10 編輯
ethanliang 發表於 13-3-8 17:47
sunny兄您好:請問,我用VB 2012程式碼與呼叫順序,在VB6的環境,是否還有其它需要修正的部分?謝謝 !  ...

我不可能一行一行去看您的程式,
不知您有程式設計的基楚嗎,
如果有的話, 您拿他在 VBA 內的程式,是 Excel 範例喔, 不是您轉過的程式喔 !
用在 VB 6 基本上是沒有問題的,
有出錯的地方從訊息說明再改一下就可以了,
我的程式五年前就寫了,
我也要去找找原始碼才行,
您用 VB 6 跑跑,
有錯再貼出來,
可以一起討論幫忙解決 ~




發表於 13-3-8 19:05 | 顯示全部樓層
C#沒有遇過這一類型的問題ㄝ

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

這個能ctach出是在哪一行掛點的....
發表於 13-3-8 19:23 | 顯示全部樓層
我用 VB.NET 也沒發生這些問題
考慮 NET 以後有 64 bit 才選它的
在64bit OS 跑時, 速度效能會快過 32bit 程式很多
 樓主| 發表於 13-3-8 23:24 | 顯示全部樓層
sunny 發表於 13-3-8 18:07
我不可能一行一行去看您的程式,
不知您有程式設計的基楚嗎,
如果有的話, 您拿他在 VBA 內的程式,是 Excel  ...

sunny兄 您好:
不好意思,我的程式設計基礎薄弱,
最近才買書自修VB.NET,
所以,VB6 可以說是完全陌生,
也缺VB6安裝軟體,
請問有免費下載 VB6的地方嗎 ?
謝謝!
 樓主| 發表於 13-3-8 23:27 | 顯示全部樓層
jeffrey 發表於 13-3-8 19:23
我用 VB.NET 也沒發生這些問題
考慮 NET 以後有 64 bit 才選它的
在64bit OS 跑時, 速度效能會快過 32bit  ...

jeffrey 您好:
請問您用的VB.NET是哪一個版本?
2005 or 2008 or 2010 or 2012?
也是在Win7 環境下執行嗎 ?
謝謝 !
 樓主| 發表於 13-3-8 23:32 | 顯示全部樓層
pazival01 發表於 13-3-8 19:05
C#沒有遇過這一類型的問題ㄝ

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

pazival01 您好:
VB也有 try catch的功能,
我有試過,
可能是我的程式底子太差,
所以,試了一個多月,
還是無法克服 4分鐘的魔咒,
實在很懊惱。
 樓主| 發表於 13-3-11 08:03 | 顯示全部樓層
jeffrey 發表於 13-3-8 19:23
我用 VB.NET 也沒發生這些問題
考慮 NET 以後有 64 bit 才選它的
在64bit OS 跑時, 速度效能會快過 32bit  ...

jeffrey兄您好:
請問您,如何將群益的config.ini、SKQuoteLib.dll檔,加入VB.NET ?
謝謝。
我一直無法把這2個檔加入『方案總管』內,
只好直接複製貼到 /bin/Debug/內,
不知這種做法是否OK ?
 樓主| 發表於 13-3-12 20:42 | 顯示全部樓層
sunny 發表於 13-3-8 18:07
我不可能一行一行去看您的程式,
不知您有程式設計的基楚嗎,
如果有的話, 您拿他在 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)
發表於 13-3-13 01:46 | 顯示全部樓層
... Function SKQuoteLib .... 要有空格喔,
其他的有照貼嗎?
 樓主| 發表於 13-3-13 12:45 | 顯示全部樓層
sunny 發表於 13-3-13 01:46
... Function SKQuoteLib .... 要有空格喔,
其他的有照貼嗎?

sunny兄,您好:
VB6 程式碼如下,
執行時會發生  AddressOf 運算子的用法不正確(如紅色字)
請幫我看看,謝謝。
Option Explicit
'*** 宣告DLL
Private Declare Function  SKQuoteLib_Initialize Lib"SKQuoteLib.dll" (ByVal strID As String, ByVal strPass As String) AsLong
Private Declare Function  SKQuoteLib_EnterMonitor Lib"SKQuoteLib.dll" () As Long
Private Declare Function  SKQuoteLib_AttachConnectionCallBack Lib"SKQuoteLib.dll" (ByVal Func As Long) As Long
Private Declare Function  SKQuoteLib_AttachTicksCallBack Lib"SKQuoteLib.dll" (ByVal Func As Long) As Long
Private Declare Function  SKQuoteLib_RequestTicks Lib"SKQuoteLib.dll" (ByRef Page As Integer, ByVal Stock As String) AsLong
Private Declare Function  SKQuoteLib_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 TTick
  Ptr AsLong
  Time As Long
  Bid As Long
  Ask As Long
  Close As Long
  Qty As Long
End 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
'*** 接收ConnectionCallBack
Sub 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.Qty
  
  End 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
發表於 13-3-13 16:40 | 顯示全部樓層
我貼上 VB6 跑不會出現 AddressOf 的問題,,
有問題的是您有些字連在一起, 把他分開即可,
記得這些宣告都要放在 "模組" 喔,
Sub btnCheckin_Click() 和 Sub btnQuote_Click() 可以放在表單的程式碼內,
妳下載的範例程式有沒有一個 SKQuote.exe 呢?
先執行那個看看是否 Work , 不然不知是否開通 ~
 樓主| 發表於 13-3-13 19:25 | 顯示全部樓層
sunny 發表於 13-3-13 16:40
我貼上 VB6 跑不會出現 AddressOf 的問題,,
有問題的是您有些字連在一起, 把他分開即可,
記得這些宣告都要 ...

sunny兄,您好:
1. SKQuote.exe 有試過,已開通。
2. 您說把宣告放在『模組』裡?
    請問模組所用的程式碼是哪個指令 ?
3. 我修正後的程式碼,還是會產生AddressOf問題,
    請您再幫我看看,謝謝。
更新後程式碼如下:
Option Explicit
'*** 宣告DLL
Private Declare FunctionSKQuoteLib_Initialize  Lib  "SKQuoteLib.dll" (ByVal strID As String,ByVal strPass As String)
As Long
Private Declare FunctionSKQuoteLib_EnterMonitor  Lib  "SKQuoteLib.dll" () As Long
Private Declare FunctionSKQuoteLib_AttachConnectionCallBack  Lib  "SKQuoteLib.dll" (ByVal FuncAs Long) As Long
Private Declare FunctionSKQuoteLib_AttachTicksCallBack  Lib  "SKQuoteLib.dll" (ByVal Func AsLong) As Long
Private Declare FunctionSKQuoteLib_RequestTicks  Lib  "SKQuoteLib.dll" (ByRef Page As Integer,ByVal Stock As String)
As Long
Private 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 TTick
  Ptr As Long
  Time As Long
  Bid As Long
  Ask As Long
  Close As Long
  Qty As Long
End 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
'*** 接收ConnectionCallBack
Sub 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.Qty
  
  End 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
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-11-23 02:40

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |