取得壓縮包解壓後, 會有以下內容 DbfTCdll2.dll 為API動態聯結程式庫 DbfTCdll2.h 為C++標頭檔,C++程式可直接include,其他程式(.Net,C#,VB,..)則可參考作對應宣告 標頭檔內所有提供之API附有繁體中文功能說明 <src> 提供實際程式範例6個,皆可直接適用於 VC, DevC, wxDevC, BCB, CodeGear 程式內容含有繁體中文細部說明, 建議參考順序為 -QueueMode , -BackupMode , -CB-Demo , -CB-Tick , -CB-MyTag , -CB-Quote <bin> 用來作為編譯輸出路徑 <VC6> 為直接可以調用之VC6專案, VS8/VS9/VS10可直接升級專案 其它專案建立可以參考 C++專案建立範例 API含有資料處理用的Quote Manager與對應的範例,可參考 DbfTC API - Quote Manager 由於Server端是可以有權限控管的,因此相同Account只能建立一個連線, 因此若欲同時嘗試多個Client連線測試,於 fnDbfTCdll_InitUser 呼叫時須指定不一樣的User Account, 以機房端的接收設計,一般建議可以用應用程式的名稱與版本或是以主機的HOST名稱作為Account內容 相同API, 於C#之參考範例 [DllImport("DbfTCdll2.dll")] private static extern long fnDbfTCdll_SelectDataSet(string cpDataSetString); [DllImport("DbfTCdll2.dll")] private static extern bool fnDbfTCdll_InitUser(string cpUserString); [DllImport("DbfTCdll2.dll")] private static extern bool fnDbfTCdll_Start(string cpHostString); [DllImport("DbfTCdll2.dll")] private static extern void fnDbfTCdll_Stop();
[DllImport("DbfTCdll2.dll")] private static extern int fnDbfTCdll_PeekPacketLen(); [DllImport("DbfTCdll2.dll")] private static extern int fnDbfTCdll_PeekPacket(string vpBuf, int iBufSize); [DllImport("DbfTCdll2.dll")] private static extern int fnDbfTCdll_RecvPacket(StringBuilder vpBuf, int iBufSize);
private void button1_Click(object sender, EventArgs e) { bool a; fnDbfTCdll_SelectDataSet("0x6816=KGQ"); a = fnDbfTCdll_InitUser("demo-cs"); if (fnDbfTCdll_Start("127.0.0.1:32128")) { Thread.Sleep(1000); int iPktLen, count = 0; StringBuilder caPktBuf=new StringBuilder(4096);
while (true) { while ((iPktLen = fnDbfTCdll_RecvPacket(caPktBuf, 4090)) > 0) { string szData = caPktBuf.ToString(); label1.Text=string.Format("Time: {0} len={1},{2}", DateTime.Now.ToLongTimeString(),iPktLen, szData); label1.Update(); } Thread.Sleep(5); } } else MessageBox.Show("false");
}
private void button2_Click(object sender, EventArgs e) { fnDbfTCdll_Stop(); }由於 C# 的 DllImport 定義在 System.Runtime.InteropServices 所以程式中要記得先宣告 using System.Runtime.InteropServices; //for DllImport
要用Callback方式的話,可以像下面例子中 DllCallback 與 ItemProcessAddress 這樣用public delegate void DllCallback(string DBName, string VarName, string Symbol, string NewValue, string OldValue);
[DllImport("DbfTCdll2.dll", EntryPoint = "fnDbfTCdll_CallBack_Register")] private static extern bool fnDbfTCdll_CallBack_Register(DllCallback fCB, int iRegisterMethod); //callback function
public static void ItemProcessCallback(string DBName, string VarName, string Symbol, string NewValue, string OldValue)
{ // ... some to do ...
}
static DllCallback ItemProcessAddress = ItemProcessCallback; //注意要用 static static void Main(string[] args) { fnDbfTCdll_CallBack_Register(ItemProcessAddress, 2); //api call fnDbfTCdll_SelectDataSet("0x6816=KGQ"); fnDbfTCdll_InitUser("testuser"); if (fnDbfTCdll_Start("127.0.0.1:32128")) { while (true) { Thread.Sleep(10); } } } //如果api如果是return (char *)的, 雖然x86平台可以直接用string對應使用完全正常, //但是x64平台請記得要改用指標(如 IntPtr) 作為回傳方式對應, 之後再轉成 string 即可 (此方式x86平台亦可) 可以由微軟文件裏指定進入點的章節中進一步瞭解: Visual Basic, C#, C++ 基本上有.dll檔, 也知道API如何宣告就能使用了, 於.NET上要載入dll使用api確實比以前簡單容易, 只是效能比較差作業搭配環境需要加以確認而已, 若是處理的資料量不大基本上用.NET比較容易上手 確認收到資料後, 要知道tag的意義可以請資訊提供廠商由Server端的程式上輸出一份列表(可以參考 FeedServer/API ), 或參考目前制式的一些已知清單: Tag-Tables (大部分線上應用都是這一份 DbfTC API Tag List for PATS ) 如果是下面的重播模擬測試環境可以參見: KGQ Tag-List 倘若已有現行使用PATS's API開發之程式, 也可以選擇使用 fakePATS API 將現行架構直接移轉 相關文章 重播模擬測試獨立環境 KGQ_HK_20110113 進階範例 使用HFOCX資訊示範AmiBroker上用ADK設計Realtime Quote |