1. 程式人生 > >基於C++/CLI開發和封裝CTP介面供C#託管程式碼進行呼叫

基於C++/CLI開發和封裝CTP介面供C#託管程式碼進行呼叫

        圈內幾乎所有的CTP封裝的介面都是有償獲取的,或者乾脆不開源,筆者在無數個深夜翻來覆去的查詢資料之後,終於完成了初步的CTP基於C++/CLI的封裝(無與倫比的痛苦。。。)。

       剛開始的時候一聽到要用C++/CLI這個陌生的工具來封裝就一個頭十個大,但真正的完成了以後會過頭一看,感覺很簡單,所以初學者千萬不要先入為主,等你學完了C++/CLI可能你會跟筆者一樣有一種打開了新世界的大門的趕腳。。。。

        筆者不太會寫部落格,就怎麼簡單怎麼來吧。。。。

        注:封裝過程的各種設定和注意還是有點多的,所以這還是有點難度的。。。。

下載好以後放到D盤的根目錄:D:\boost_1_67_0\boost_1_67_0.

、、、、、、、、、、、、、、、、、、、、、、、、、、編譯Boost、、、、、、、、、、、、、、、、、、、、、、、、、

        編譯A:開啟VS2017 x64本機工具命令提示

        編譯B:在命令提示視窗進入到boost安裝目錄中  cd\boost_1_67_0\boost_1_67_0

        編譯C:輸入:bootstrap.bat 執行完成後,接著輸入 b2 --toolset=msvc-14.1 --build-type=complete(因為VS2017,所以對應著14.1版本)

        編譯D:沒有了D,有的只是一直的等待幾個小時(如果電腦效能好的話半個小時就可以完成,效能差的話。。。。。)

、、、、、、、、、、、、、、、、、、、、、、、、編譯Boost、、、、、、、、、、、、、、、、、、、、、、、、、、、

        1、不太會C++/CLI的朋友們,建議還是去看一下下面的這本書《Visual C++/CLI從入門到精通》。。。

        2、好了!開始專案的第一步吧。。。

        3、開啟VS2017(最好是用最新版的VS吧,新功能很棒),建立一個動態連結庫(dll),把檔案命名為TdCTPApiClr(封裝的是交易api)

        4、開始設定各種屬性:

     1)專案--右鍵--屬性--常規 【公共語言執行時支援項:選擇公共語言執行時支援(clr)】;

      2)選擇VC++目錄 【包含目錄:選擇D:\boost_1_67_0\boost_1_67_0,引用目錄:選擇D:\boost_1_67_0\boost_1_67_0,

      3)連結器:附加庫目錄選擇D:\boost_1_67_0\boost_1_67_0\stage\lib】

        5、完成上述的設定後別忘了在dllmain.cpp檔案的頭部加一句話:#pragma unmanaged 

        6、好了完成了以上的設定就可以開始真正的封裝咯 。。。。。

       7、把原生帶來的cpp檔案刪掉,新建類(生成一個h檔案和cpp檔案),在h檔案中新增namespace(並且cpp也要寫上一樣的名稱空間),命名一個託管類 public ref TdCTPApiClr(public不能少),實現cpp檔案中的建構函式和解構函式,如下圖:

  • 8、再生成一個類檔案【CenterSpi.h/CenterSpi.cpp】,這兩個檔案是用來封裝回調函式的,所以必須實現CenterSpi類和TdCTPApiClr類的相互呼叫。【一般如果兩個標頭檔案相互呼叫是不允許的,所以這裡特殊的處理一下,以實現兩個類相互呼叫】
  • 1)、在TdCTPApiClr.h檔案中寫上class CenterSpi、在託管類中宣告指標CenterSpi* ctspi
  • 在public下面宣告一個函式用於呼叫非託管類CenterSpi,程式碼如下:
  • ///雜項
    void CreateCenter();
  • 2)、在TdCTPApiClr.cpp檔案中include CenterSpi.h檔案
  • 實現標頭檔案中的CreateCenter方法,利用.net的方式(建構函式)把當前類傳送給非託管類
  • void TdApiClr::CreateCenter() //tdcspi
        {
            tdcspi = new TdCenterSpi(this);
        }
  • 3)、切換到CenterSpi.h檔案,在建構函式裡宣告一個託管類的物件,通過這種方式接收託管類的物件成員
  • (A、別忘記了#include<gcroot.h> 否則沒法在非託管類中例項化託管類;B、宣告一個萬能指標(void* m_ptdapiClr)用於操作託管類的控制代碼)

4)、CenterSpi.cpp檔案中通過例項化託管類 gcroot<TdApiClr^>*tdClr;宣告託管類的物件

9、至此,已經實現兩個類之間的連通,剩下的就是CenterSpi類繼承Api的回撥函式,TdCTPApiClr類操作Api的主動函式,這裡邊的程式碼量非常的大,就不在部落格裡寫了,大家可以直接去GitHub上取專案的原始碼自己研究吧(因程式設計能力有限,果發現程式碼存在問題,請指出來,大家一起進步。。。)

10、因為我是整套量化交易系統都已經封裝完畢,所以我深切的明白到後期當介面封裝完畢後到C#端操作的時候還會遇到很多的問題的,而這些細節我都是花了很長時間才解決了,也歡迎大家如果遇到不懂的可以找我交流下,相互學習,共同進步。。。。。

qq:1013359736 【風。。。】