小弟刚开始使用CTP,因为之前一直用c++ builder开发,但在编译连接的时候碰到问题: [ILINK32 Error] Fatal: Unable to open file 'CTP覆.OBJ' 我的例子很简单,头文件和lib文件的链接问题应该是解决了(用c++ builder自带的coff2omf程序把Lib文件转换成c++ builder的lib文件格式),但在link的时候出现这个错误。我查了google也没找到解决方案。 不知道论坛中是否有人用c++ builder在开发ctp的应用,请指教!谢谢! 我的qq:2244139,方便的话,请加我,谢谢!
导出符号不兼容。。具体有很多文章比如: http://wenku.baidu.com/view/e41621c12cc58bd63186bd86.html 但是只限于VC的dll有extern "C" { void XXXX; void XXXX } 这样的按纯C形式导出的符号可以直接在builder中由连接器自动链接。 关于导出符号及其命名规则的文章(超级繁琐): http://www.2cto.com/kf/201205/132548.html http://bbs.csdn.net/topics/50283722 如果硬要用builder,则需要自己用loadlibrary 手动加载符号。 具体可按照如下文章尝试: http://www.360doc.com/content/08/0831/20/7635_1596433.shtml 中的“显式链接”段。
哦...没这么复杂,,按照这样的代码就行了..(行情的实例) #include <Windows.h> //一个指向静态函数CreateThostFtdcMdApi的函数指针 typedef void* (*CB_CThostFtdcMdApi)(const char *pszFlowPath , const bool bIsUsingUdp); int main() { CThostFtdcMdApi * mdinstance = NULL; //实例指针 CB_CThostFtdcMdApi pmdcreate; //函数指针 //win下手动加载dll HINSTANCE hDLL; hDLL=LoadLibrary("thostmduserapi.dll"); pmdcreate = (CB_CThostFtdcMdApi)GetProcAddress(hDLL,"?CreateFtdcMdApi@CThostFtdcMdApi@@SAPAV1@PBD_N@Z"); //很重要::这个符号通过dumpbin /export thostmduserapi.dll得到..是最后一个导出函数的导出函数名称 if (pmdcreate) { mdinstance = (CThostFtdcMdApi *)pmdcreate("MD",true); printf("Found Create\n"); } else { printf("no entry found.\n"); } //这个MdSpi继承ThostFtdcMdSpi..你自己实现需要的回调函数.... MdSpi d; //继承的这个Spi当中用到了Api实例指针,,传过去.. d.mdapi=mdinstance; mdinstance->RegisterSpi(&d); mdinstance->RegisterFront(mdfront); mdinstance->Init(); mdinstance->Join(); //Sleep(10000); FreeLibrary(hDLL); return 0; } 应该庆幸CTP的Api的singleton模式,使得那个静态函数指针如此简单..只需要一个这样的指针就可以了...
你这种方式应该不能实现多账户吧(对于交易来说)?用C++builder是无法直接使用DLL其中的对象的。 我用的是delphi,与C++ Builder很类似,最后不得不自己做了一个转换层来实现多账户的。
这需要用到delphi(C++ Builder)的一个未文档化的技巧,虽然目前的版本能用但是不能保证以后都能用。 还有一种办法是再多1层转发,这样就没问题了,但是性能会受到影响。 其实做了有关CTP项目后,我倾向于还是用VC++ 实现一个命令行方式的,拿这个作为一个基本的内核,先能跑起来测试起来,然后再用熟悉的能制作界面的编程语言做个界面与其通信,比如通过postmessage方式,并不需要紧耦合。这样兼顾了性能、易用性、可测试性。 另:QQ加你了,和你详细聊
CTP开发不能直接用C++ Builder,主要是原因由于C++语言本身只是把语言标准化了,而对语言的具体实现细节没有标准化造成的,比如,要支持名字重载而引入的name mangling,再比如,为支持多态的vtbl,这些编译器的内部实现各家都是不同的,所以,C++的对象跨编译器几乎都不兼容。 解决办法有几个: 1、COM对象是二进制兼容的,可以把VC++实现的CTP用COM包裹起来,这样在支持COM的语言里都可以调用了; 2、用C把VC++实现的CTP包裹起来,不过这样就丧失了对象技术的好处了。