DbfTCdll2.dll 範例程式碼 APITEST
張貼日期:Jan 16, 2011 2:26:4 PM
取得壓縮包解壓後, 會有以下內容
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 將現行架構直接移轉
相關文章
進階範例