資訊系統/架構/產品‎ > ‎KGQ‎ > ‎GMDS相關文章‎ > ‎GMDS‎ > ‎

DbfTCdll2.dll 範例程式碼 APITEST

張貼者:2011年1月16日 上午6:26Wei-Xiuang Wang   [ 已更新 2019年1月14日 下午11:13 ]

取得壓縮包解壓後, 會有以下內容
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方式的話,可以像下面例子中 DllCallbackItemProcessAddress 這樣用

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


註解