有一说一话新版和谐

[通达信] 精华 3
设置
21090 61 白一小目2 Lv.7 发表于 · 2021-3-1 13:51 显示全部楼层 正序浏览 |
跳转到指定楼层
本帖最后由 白一小目2 于 2021-3-1 13:55 编辑

通达信软件改版后,最大的变化是,从原来的MFC4.2(MFC42)升级到了MFC10.0(MFC100),这个不只是版本的变化,而是舍弃了一些不合理的或低效的,比如CTime类和CString类都被扬弃了,代之以更高效的解决方案。这个升级,还改变了一些函数的接口规范。如果你不了解__cdecl和__stdcall/pascal规范的差别,在根据旧版补码尝试和谐新版程序时,就可能落坑里。

MFC42的函数,基本是采用了__stdcall/pascal规范,这样与Windows库函数各种DLL的设计一致,函数调用如智能导弹发射,发射后就不用管了。而MFC100,为了灵活性,一些函数采用了__cdecl规范,还有一些追求极致效率,采用了__fastcall规范,用寄存器传第参数。举个例子:

在旧版L1/L2切换代码中,有 call    <jmp.&MFC42.#operator+_924>,它的作用是把两个字符串合成为一个,生成一个完整的配置文件路径。MFC100没有对应的函数,要在新版中实现它的功能,可以借助MFC100中的新版String类函数:

字符串合成函数(目标字串地址缓存区,前字串地址,前字串长度,后字串地址,后字串长度),返回合成字串长度

push 后字串长度
push 后字串地址
push 前字串长度
push 前字串地址
push 目标字串地址指针
call   mfc100.#ATL::CSimpleStringT<char,1>::Concatenate_2626
add    esp, 0x14                                ;调用后自己清理堆栈 —— 这一句非常关键,否则,堆栈乱序,必然导致程序崩溃。

当然,也可以模仿MFC42.#operator+_924,接受三个参数

push 后字串地址
push 前字串地址指针
push 目标字串地址指针
Call MyStrConcatenate

在MyStrConcatenate中,调用MFC100函数计算出省去的参数

根据字符串地址指针,获得字串长度,没有参数传入,指针由ecx带入,返回长度在eax
mov ecx, 前字串地址指针
call  mfc100.#ATL::CSimpleStringT<char,1>::GetLength_5207

根据字符串地址指针,获得字串地址,没有参数传入,指针由ecx带入,返回地址在eax
mov ecx, 前字串地址指针
call   mfc100.#ATL::CSimpleStringT<char,1>::GetString_6207

聪明人会发现,755zyb的代码里,通达信的工程师们已经设计了这样的一个函数,TdxW.004060A0.

用它直接代替MFC42.#operator+_924不就得了,啰嗦啥?Wait a minute, 他们也许不是故意的挖的坑,但是,坑就在那里,别问了,他们用了__cdecl规范,你需要自己维护堆栈的完整性。

call    <jmp.&MFC42.#operator+_924> -->  call TdxW.004060A0 + add esp,0xC

没有这个add esp,0xC,你会遇到莫名的退出或崩溃。(看看坛子里贴出的代码,你就不难理解,为什么新版的和谐有那么多的莫名退出了)

类似的问题还存在于 call    <jmp.&MFC42.#CTime::GetLocalTm_3337>的替换上。



查看全部打赏
  • 开心果+20理想币 共享币 +2分享值 : 老师辛苦了!
  • 股道西风+100理想币 +10共享币 +10分享值 : 春风送花香,快乐每一天!
  • 你起+20理想币 共享币 分享值 : 春风送花香,快乐每一天!
  • 小骆驼+20理想币 共享币 +2分享值 : 春风送花香,快乐每一天!
  • 地区999+20理想币 共享币 分享值 : 多谢分享
  • 地势坤97+20理想币 共享币 +2分享值 : 春风送花香,快乐每一天!
本主题由 任务系统 于 2021-3-2 00:38 加入精华

举报

使用道具 扔鸡蛋(0) 回复

荣荣8
Lv.4
发表于 2021-3-6 13:16 复制 查看全部楼层
7.49还在战,只要股票池,能交易,跨券商,bs,委托自动标记,另外的都不重要

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

阳光134
Lv.2
发表于 2021-3-6 11:20 复制 查看全部楼层
勒塞石头 发表于 2021-3-1 15:13
7.49还在战,只要能交易,跨券商,bs,委托自动标记,另外的都不重要

7.49的能否分享一下

举报

使用道具 扔鸡蛋(0) 回复

二郎777
Lv.4
发表于 2021-3-4 11:40 复制 查看全部楼层
实在是看不懂。所以点个赞!

举报

使用道具 扔鸡蛋(0) 回复

黑马魔王
Lv.3
发表于 2021-3-4 10:06 复制 查看全部楼层
虽然看不懂,但是感觉好厉害的,点赞

举报

使用道具 扔鸡蛋(0) 回复

雕刻时光A
Lv.4
发表于 2021-3-4 05:40 复制 查看全部楼层
看不懂啊

举报

使用道具 扔鸡蛋(0) 回复

孙忠强
Lv.5
发表于 2021-3-4 05:02 复制 查看全部楼层
真正高深的软件学问呢。值得学习!

举报

使用道具 扔鸡蛋(0) 回复

王人二
Lv.7
发表于 2021-3-3 19:34 复制 查看全部楼层
add esp,1c是平衡堆栈的,具体根据push来决定

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

菜鸟联盟
Lv.4
发表于 2021-3-3 19:30 复制 查看全部楼层
不是学软件的搞不懂

举报

使用道具 扔鸡蛋(0) 回复

峰808
Lv.2
发表于 2021-3-3 18:50 复制 查看全部楼层
虽然没有看明白,但是觉得老师说得特别高大上,纯支持!!!

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

莲花68
Lv.3
发表于 2021-3-3 04:18 复制 查看全部楼层
就是玩具随便玩玩,完善下呗。

举报

使用道具 扔鸡蛋(0) 回复

独行侠009
Lv.2
发表于 2021-3-3 03:30 复制 查看全部楼层
老师们幸苦了,我看都看不懂的

举报

使用道具 扔鸡蛋(0) 回复

白一小目2
Lv.7
发表于 2021-3-2 23:06 复制 查看全部楼层
这个帖子有不少人看了,但是,用上了吗?如果你要和谐高行连接,还要从5e2cd8跳去和谐代码。那么,旧版的和谐代码前必须加add esp,0x1C

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

勒塞石头
Lv.4
发表于 2021-3-2 21:11 复制 查看全部楼层
九口 发表于 2021-3-2 21:09
7.49我试过很多,都不能跨券商(银河不能登录交易),请问你是用的哪一个版本?能分享吗?

这是券商的问题, 没办法,哈哈

举报

使用道具 扔鸡蛋(0) 回复

九口
Lv.6
发表于 2021-3-2 21:09 复制 查看全部楼层
勒塞石头 发表于 2021-3-1 15:13
7.49还在战,只要能交易,跨券商,bs,委托自动标记,另外的都不重要

7.49我试过很多,都不能跨券商(银河不能登录交易),请问你是用的哪一个版本?能分享吗?

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

大牛红
Lv.3
发表于 2021-3-2 19:33 复制 查看全部楼层
勒塞石头 发表于 2021-3-1 15:13
7.49还在战,只要能交易,跨券商,bs,委托自动标记,另外的都不重要

给个下载地址呗,谢谢

举报

使用道具 扔鸡蛋(0) 回复

心缘
Lv.3
发表于 2021-3-2 11:12 复制 查看全部楼层
好复杂啊,真看不懂

举报

使用道具 扔鸡蛋(0) 回复

湖南001
Lv.2
发表于 2021-3-2 11:11 复制 查看全部楼层
小白一枚,不明觉厉

举报

使用道具 扔鸡蛋(0) 回复

清风秀林
Lv.4
发表于 2021-3-2 09:37 复制 查看全部楼层
高深理论技术在下实在的看不懂

举报

使用道具 扔鸡蛋(0) 回复

啥都爱
Lv.3
发表于 2021-3-2 08:44 复制 查看全部楼层
需要调用MFC42,试试使用工具增加MFC42.dll,导入表增加需要使用的函数。不过,MFC42已成过去式了。

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

烟花三月上
Lv.2
发表于 2021-3-2 08:41 复制 查看全部楼层
虽然没看明白,但技术毋庸质疑。

举报

使用道具 扔鸡蛋(0) 回复

老树丫丫
Lv.3
发表于 2021-3-2 08:35 复制 查看全部楼层
也看不懂,来点赞的,

举报

使用道具 扔鸡蛋(0) 回复

雪客fvptk
Lv.4
发表于 2021-3-2 00:17 复制 查看全部楼层
小白一个,只能用点赞来表达。

举报

使用道具 扔鸡蛋(0) 回复

我革命者
Lv.3
发表于 2021-3-1 23:41 复制 查看全部楼层
老师讲的太专业,小白只能跟着看了
还是给老师点赞吧!

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

随机选股
Lv.3
发表于 2021-3-1 21:14 复制 查看全部楼层
师傅别念了!
前面 到 __stdcall/pascal 还能明白点
后面 啥堆栈平衡 看了就头疼
7777777.jpg

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

地势坤97
Lv.7
发表于 2021-3-1 20:14 复制 查看全部楼层
白一小目2 发表于 2021-3-1 17:12
006E9B0D   C605 6A37AD00 00 mov  byte ptr ds:[0xAD376A], 0x0        mov  byte ptr ds:[0xAD376A], 0xD0  ; ...

老师出手解决那个 笔 的问题吧!

举报

使用道具 扔鸡蛋(0) 回复

地势坤97
Lv.7
发表于 2021-3-1 19:05 复制 查看全部楼层
白一小目2 发表于 2021-3-1 17:30
说了呀,就象你自己替换的那样。只不过,后面加一句add esp,0xC。空间问题自己想个办法嘛

不搞了,反正自动初始化的切换又不需要,bl后面还不知道能玩多久呢

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

无花之果
Lv.4
发表于 2021-3-1 18:10 复制 查看全部楼层
实在是看不懂。所以点个赞!

举报

使用道具 扔鸡蛋(0) 回复

林天石
Lv.5
发表于 2021-3-1 18:01 复制 查看全部楼层
7.47还在用,只要能交易,跨券商,bs,委托自动标记,另外的都不重要,该有不该有功能加上都行,新全景、新概念、电商、席位、游资等等。755就有个早晚抢筹吗?754没有新东西。

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

逗阳yc
Lv.4
发表于 2021-3-1 17:53 复制 查看全部楼层
看得我是一愣一愣的,还是懒惰有现成最好。

举报

使用道具 扔鸡蛋(0) 回复

白一小目2
Lv.7
发表于 2021-3-1 17:42 复制 查看全部楼层
地区999 发表于 2021-3-1 17:39
老师,7.55如何替换call    ?

没有简单的替代方案。需要调用CRT(msvcr100.dll)库函数。参数传送不同,还要调后的清理,需要重新设计代码。

举报

使用道具 点亮(0) 扔鸡蛋(0) 回复

您需要登录后才可以回帖 登录

本版积分规则 《理想财富服务协议》《免责声明》

站长推荐 关闭 上一条 /7 下一条
回顶部 到页底
快速回复 返回顶部 返回列表