VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 2
声望: 1

在ctp 和openctp的tts 同时导入时 会出现 4097错误,单独用每一个都没问题。
from vnpy_ctp import CtpGateway
from vnpy_tts import TtsGateway

则会出现只能ctp可以登录,而tts不能登录错误 4097
文档说是 这两个包用了相同文件名的dll
thostmduserapi_se.dll
thosttraderapi_se.dll
产生了冲突。

就想着把tts的dll换名字,如果只是单纯更改dll名字,会出现
DLL load failed while importing vnttsmd: 找不到指定的模块。

需要修改thostmduserapi_se.lib thosttraderapi_se.lib 文件再重新生成 vnttsmd.pyd 和 vnttstd.pyd 才可以。

但用记事本打开lib文件 里边连接的dll名字修改的话,在编译过程中会出现错误。
需要从dll 生成 def文件,然后def文件再生成新的lib文件,再编译就可以了。
我的工作环境是 win10 、python3.10、 visual studio 2017
操作如下。
先下载vnpy_tts https://gitee.com/vnpy/vnpy_tts
1 打开Vs_2017的x64_x86交叉工具命令提示符
2 进入dll的目录
3 输入指令
DUMPBIN thostmduserapi_se.dll /EXPORTS /OUT:thostmduserapi_se.def
打开thostmduserapi_se.def文件如下

Dump of file thostmduserapi_se_tts.dll

File Type: DLL

Section contains the following exports for thostmduserapi_se.dll

00000000 characteristics
FFFFFFFF time date stamp
    0.00 version
       1 ordinal base
       7 number of functions
       7 number of names

ordinal hint RVA      name

      1    0 0001A7A0 ??0CThostFtdcMdApi@@QEAA@AEBV0@@Z
      2    1 0001A7A0 ??0CThostFtdcMdApi@@QEAA@XZ
      3    2 0001A790 ??1CThostFtdcMdApi@@IEAA@XZ
      4    3 0001A7B0 ??4CThostFtdcMdApi@@QEAAAE$0@AEBV0@@Z
      5    4 000449B8 ??_7CThostFtdcMdApi@@6B@
      6    5 0001A7D0 ?CreateFtdcMdApi@CThostFtdcMdApi@@SAPE$1@PEBD_N1@Z
      7    6 0001A8D0 ?GetApiVersion@CThostFtdcMdApi@@SAPEBDXZ

Summary

   16000 .data
    4000 .pdata
   15000 .rdata
    1000 .reloc
    1000 .rsrc
   39000 .text
    1000 _RDATA


修改成如下

LIBRARY "thostmduserapi_se_tts"
DESCRIPTION "thostmduserapi_se_tts library"
EXPORTS
??0CThostFtdcMdApi@@QEAA@AEBV0@@Z
??0CThostFtdcMdApi@@QEAA@XZ
??1CThostFtdcMdApi@@IEAA@XZ
??4CThostFtdcMdApi@@QEAAAE$0@AEBV0@@Z
??_7CThostFtdcMdApi@@6B@
?CreateFtdcMdApi@CThostFtdcMdApi@@SAPE$1@PEBD_N1@Z
?GetApiVersion@CThostFtdcMdApi@@SAPEBDXZ

4保存文件 并输入命令
lib /def:thostmduserapi_se.def /MACHINE:X64

则生成新的thostmduserapi_se.lib 文件

5 重新编译生成 vnttsmd.pyd

对于thosttraderapi_se.dll 如法炮制即可。
将生成的 vnttsmd.pyd 和 vnttstd.pyd复制到 python 环境下vnpy_tts\api\下

6 将vnpy_tts\api\ 下的 thostmduserapi_se.dll 改成 thostmduserapi_se_tts.dll
thosttraderapi_se.dll 改成 thosttraderapi_se_tts.dll 即可。
这样就可以同时登录ctp和tts。多账户了。

Member
avatar
加入于:
帖子: 1631
声望: 118

感谢分享!

Member
加入于:
帖子: 21
声望: 5

666,居然还能这么操作,我们自己是直接编译成不同名的dll的

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】