在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。多账户了。