在VB6 IDE中实现安全子类化

2024-10-24  本文已影响0人  小辣椒高效Office

作者:胎神


原帖来源:【VB】 在VB6IDE中实现安全子类化  文章链接会被屏蔽,请自己搜索 0xaa55 或 技术宅的结界 (出处:技术宅的结界,转载请保留出处 )

文章最后有 源码示例下 载。

  VB6给我们开发者提供了非常简单方便的GUI设计功能,因此受到了大多数开发者的喜爱。可是VB6提供的使用功能却非常少,这个时候就通过子类化等手段绕过VB6的封装,直接取接管底层的系统消息来对其扩展。
  然而,VB6IDE的作者当初犯了一个非常胎神的错误,那就是让用户编写的代码直接在IDE进程中运行了,没有通过子进程+进程调试模式(有的胎神看到这里会反驳说着就是VB6优势不用花大量时间去先编译代码,我表示VB6作者完全可以设计一个叫 解释器.exe 的独立可执行程序到VB6安装包中,在我们要调试运行的时候,它直接发代码文本发送给这个子进程不就行了,这样不就既有解释运行的快速启动,又有不崩IDE的风险吗?),这就会导致程序一旦出现致命错误就把整个IDE给崩掉了(很多开发者这个时候都还没来得及保存代码)。
  言归正传,现在假如某个开发者本身技术确实比较牛批,不容易写出本身有致命错误的代码,但是在Form、控件被子类化的时候,VB6本身是回调机制就已经自带了极易导致致命错误的风险(哪怕你本身代码写的再好),只要不小心下了断点、点了暂停、结束运行,或有没有On Error的异常都会导致VB6IDE崩掉。

  经过我多年的研究终于搞清楚了子类化极易导致IDE崩掉的根本原因:

  为了解决以上各种蛋疼问题,我选择了使用加载外部dll方案,因为:

  顺便再说一下传统的SetWindowLong的子类化方式的缺陷:

  其实SetWindowLong的缺陷巨硬早在二十多年就给我们提供了解决方案,使用新API SetWindowSubclass 来子类化(SetWindowSubclass 保证了32位和64位通用、安全管理了多重挂钩,支持了任意顺序解除、并且提供了指针长度的任意附加数据)。
  所以,最后我根据以上原理,使用VC艹封装一个叫 sscls.dll(全称 SafeSubclass 安全子类化)的组件,内部使用轻量级COM机制来实现既不需要注册又能获得COM对象自动安全析构,使用新子类化API SetWindowSubclass 来保证多次子类化的安全和回调对象关联,调用VBA6.DLL的EbMode来监测IDE执行状态,以防止暂停和停止时极易崩掉IDE的问题。

  以下则是 SafeSubclass(安全子类化)组件 的使用方法:

1-打开VBAIDE目录

2-复制到VB6安装目录

3-在VB6工程中打开引用对话框

4-添加sscls.tlb文件的引用

5-编写代码进行子类化

6-可以在消息中任意暂停

7-强制结束也可以正常退回IDE设计模式并自动释放子类化对象的内存

8-示例目录中的sscls.dll用于最终发布的exe携带

下载:胎神作品SafeSubclass.rar

链接: https://pan.baidu.com/s/1jpvJRhd-Zs4VskSCQuTMHQ?pwd=rjtj 提取码: rjtj

如对您有帮助,可点个赞及关注我

上一篇 下一篇

猜你喜欢

热点阅读