VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: topses

[讨论] 18年来永远的迷!VB中窗口子类化在IDE调试时为什么会导致IDE崩溃?

[复制链接]
 楼主| 发表于 2016-2-2 09:27:22 | 显示全部楼层
reker 发表于 2016-1-25 10:43
这个问题好几年前就有很详细的解释了。你不知道说明你没仔细看论坛

首先谢谢你的参与,
但我要说的是, 你说的是费话, 应该给个链接吧.
那我可以说微软VB开发小组应该在25年前就知道问题所在了.

由此判定, 你也不清楚了解VB的调试机制. 或者100%你对其也是一知半解.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-2 09:40:49 | 显示全部楼层
本帖最后由 topses 于 2016-2-2 09:50 编辑

matthew 作为VB开发小组的成员在下面已经把这个问题说得很明白.(即我一楼的传说2)
The problem with subclassing directly to an AddressOf procedure is that VB doesn't actually give you a function pointer to the code itself, but rather to a small thunk procedure. This procedure prevents you from running the AddressOf function when you're in break mode. This thunk is out of the picture after you compile your executable, but it wreaks havoc when you're in the IDE.



为什么 要使用代理(thunk), 因为 IDE 时是 P-CODE, 由 msvbvm60.dll 解释运行. 使用P-CODE的好处, 你可以在调试时, 修改代码后继续进行调试运行. 所以必须使用代理(thunk), 因为地址是有可能会变化, 所以在IDE时有时候会崩溃, 有时则不会.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-2 10:11:08 | 显示全部楼层
为了验证 AddressOf IDE时取得是否为代理(thunk)地址, 我作了下面代码

' 验证IDE时与编译后函数真实指针
Sub RealFunAdd()
    Dim pfn As Long, lEip As Long
    ' AddressOf 取得的函数指针
    pfn = FuncAddr(AddressOf Foo)
    MsgBox "pfn(Foo):" & Hex$(pfn)
   
    ' 实际函数指针
    lEip = Foo
    MsgBox "eip(Foo):" & Hex$(lEip)
End Sub

Function Foo() As Long
    Foo = RegEIP()
End Function

Private Function FuncAddrVB(ByVal pfn As Long) As Long
    FuncAddrVB = pfn
End Function


注意:
1, RegEIP 为取得当前函数的EIP:
        __asm
        {
                mov eax, [esp]
                ret
        }
2, 编译为本机代码:无优化
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-2 10:30:27 | 显示全部楼层
上面 RegEIP 是个裸函数

下一步怎么走?
回复 支持 反对

使用道具 举报

发表于 2016-2-19 16:39:17 | 显示全部楼层
本帖最后由 reker 于 2016-2-19 17:09 编辑
topses 发表于 2016-2-2 09:27
首先谢谢你的参与,
但我要说的是, 你说的是费话, 应该给个链接吧.
那我可以说微软VB开发小组应该在25年 ...


噗  你跟我说这个,我都不知道怎么回复你。
连搜索都不会用还写什么代码,何况楼上a2si已经简单的说了部分原因,要还是不明白就去看看iceboy的代码然后自己调试一遍ide,类似但不同实现的代码论坛上有好几个。
还写了一堆不知所云的东西,也不知道你想表达什么。

附ib的代码
http://www.vbgood.com/forum.php? ... jY0N3w4MDU4Mg%3D%3D

点评

他想表达是引力波导致VB中窗口子类化在IDE调试时崩溃  发表于 2016-2-23 22:24
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-30 17:38

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表