使用C++ builder开发ctp碰到的问题

Discussion in 'CTP' started by coolpk, Dec 17, 2012.

  1. 小弟刚开始使用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,方便的话,请加我,谢谢!
     
  2. 我查了一些资料,是不是有如下的可能:
    VC写的dll中用到了类,用coff2omf的时候无法正确的转换类的信息?
     
  3. 我不是搞C++的,也不清楚。
    只不过我在一个群里面看过,ctp用C++开发编译器只能用VC,其他的都不行。
     
  4. 哎,下午装了vs2010,编译了例子,一点问题都没有,都通过了,用c++ builder就是发现Link通不过啊。。。。求大神解释一下。。。。。
     
  5. ctp在民意的支持下被人开发了C#接口,又在民意的支持下开发了java的接口。你等等吧,这种高人总会出现的。
     
  6. 求高人出现啊。。。。
     
  7. 去那个区域去找大牛帮你实现吧
     
  8. 那个区域啊?
     
  9. 你找找ctpcom,这个问题就绕过了
     
  10. 导出符号不兼容。。具体有很多文章比如:
    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
    中的“显式链接”段。
     
  11. 结合楼上兄弟的给出文章,感觉这种可能性极大。
    这样的话,就只能用封装过一层的标准C的CTP了。
     
  12. 哦...没这么复杂,,按照这样的代码就行了..(行情的实例)

    #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模式,使得那个静态函数指针如此简单..只需要一个这样的指针就可以了...
     
  13. 非常感谢楼上的兄弟,我会好好的试试看
     
  14. 你这种方式应该不能实现多账户吧(对于交易来说)?用C++builder是无法直接使用DLL其中的对象的。
    我用的是delphi,与C++ Builder很类似,最后不得不自己做了一个转换层来实现多账户的。
     
  15. 能具体说说是如何实现的吗?谢谢!
     
  16. 这需要用到delphi(C++ Builder)的一个未文档化的技巧,虽然目前的版本能用但是不能保证以后都能用。
    还有一种办法是再多1层转发,这样就没问题了,但是性能会受到影响。

    其实做了有关CTP项目后,我倾向于还是用VC++ 实现一个命令行方式的,拿这个作为一个基本的内核,先能跑起来测试起来,然后再用熟悉的能制作界面的编程语言做个界面与其通信,比如通过postmessage方式,并不需要紧耦合。这样兼顾了性能、易用性、可测试性。

    另:QQ加你了,和你详细聊
     
  17. CTP开发不能直接用C++ Builder,主要是原因由于C++语言本身只是把语言标准化了,而对语言的具体实现细节没有标准化造成的,比如,要支持名字重载而引入的name mangling,再比如,为支持多态的vtbl,这些编译器的内部实现各家都是不同的,所以,C++的对象跨编译器几乎都不兼容。
    解决办法有几个:
    1、COM对象是二进制兼容的,可以把VC++实现的CTP用COM包裹起来,这样在支持COM的语言里都可以调用了;
    2、用C把VC++实现的CTP包裹起来,不过这样就丧失了对象技术的好处了。
     
  18. 这个方法应该可以多帐户吧?
     
  19. 有没有实例提供,谢谢.