Rust: rust_libloading庫與 CTP DLL 封裝

一、庫、配置
https://github.com/nagisa/rust_libloading

toml文件中:

[dependencies]
libloading = "0.5"

二、CTP DLL資料
http://www.sfit.com.cn/5_2_DocumentDown.htm

三、c類型struct =>翻譯轉換成rust中的struct
在ctp文件中,有ThostFtdcUserApiStruct.h文件,其中有各種CTP的數據,全部是用struct來表示。這個需要全部轉換成rust的struct.
這個文件大約有近萬行,肯定要寫一個自動轉換的程序。

這個是C++中的結構體:

struct CThostFtdcDisseminationField
{
	TThostFtdcSequenceSeriesType	SequenceSeries;
	TThostFtdcSequenceNoType	SequenceNo;
};

要轉換成rust 中的結構體:[名字和類型可以沿用原來的,只是換個方式]

struct CThostFtdcDisseminationField
{
	SequenceSeries:TThostFtdcSequenceSeriesType;
    SequenceNo: TThostFtdcSequenceNoType;
};

轉換代碼:

待續.....; 可以用macro_rules!?

四、代碼

extern crate libloading as lib;
//const 
fn OnFrontConnected() -> lib::Result<()> {
    let lib = lib::Library::new("D:\\ctp-api\\ctp\\CTP\\tradeapi\\thostmduserapi.dll")?;
    unsafe {
        let func: lib::Symbol<unsafe extern "C" fn() -> ()> = lib.get(b"OnFrontConnected")?;
        Ok(func())
    }
}
fn OnHeartBeatWarning(nTimeLapse: i32) -> lib::Result<i32> {
    let lib = lib::Library::new("D:\\ctp-api\\ctp\\CTP\\tradeapi\\thostmduserapi.dll")?;
    unsafe {
        let func: lib::Symbol<unsafe extern "C" fn(i32) -> i32> = lib.get(b"OnHeartBeatWarning")?;
        Ok(func(nTimeLapse))
    }
}

fn main() {
    println!("Hello, world!");
}

待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章