在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](/user/QEAA)@AEBV0@[@Z](/user/Z)
2 1 0001A7A0 ??0CThostFtdcMdApi@[@QEAA](/user/QEAA)@XZ
3 2 0001A790 ??1CThostFtdcMdApi@[@IEAA](/user/IEAA)@XZ
4 3 0001A7B0 ??4CThostFtdcMdApi@[@QEAAAE](/user/QEAAAE)$0@AEBV0@[@Z](/user/Z)
5 4 000449B8 ??_7CThostFtdcMdApi@[@6B](/user/6B)@
6 5 0001A7D0 ?CreateFtdcMdApi@CThostFtdcMdApi@[@SAPE](/user/SAPE)$1@PEBD_N1@Z
7 6 0001A8D0 ?GetApiVersion@CThostFtdcMdApi@[@SAPEBDXZ](/user/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
