基于C++/CLI开发和封装CTP接口供C#托管代码进行调用

        圈内几乎所有的CTP封装的接口都是有偿获取的,或者干脆不开源,笔者在无数个深夜翻来覆去的查找资料之后,终于完成了初步的CTP基于C++/CLI的封装(无与伦比的痛苦。。。)。

       刚开始的时候一听到要用C++/CLI这个陌生的工具来封装就一个头十个大,但真正的完成了以后会过头一看,感觉很简单,所以初学者千万不要先入为主,等你学完了C++/CLI可能你会跟笔者一样有一种打开了新世界的大门的赶脚。。。。

        笔者不太会写博客,就怎么简单怎么来吧。。。。

        注:封装过程的各种设置和注意还是有点多的,所以这还是有点难度的。。。。

        在封装之前首先要先编译一个boost库,https://www.boost.org/users/history/version_1_67_0.html,选择末尾是7z的版本下载,

下载好以后放到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上取项目的源码自己研究吧(因编程能力有限,果发现代码存在问题,请指出来,大家一起进步。。。)

https://github.com/jxlliang/From_CLI_CTPtdapi_Packge

10、因为我是整套量化交易系统都已经封装完毕,所以我深切的明白到后期当接口封装完毕后到C#端操作的时候还会遇到很多的问题的,而这些细节我都是花了很长时间才解决了,也欢迎大家如果遇到不懂的可以找我交流下,相互学习,共同进步。。。。。

qq:1013359736 【风。。。】

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值