(此文话痨注意)

关于 VB 开发,以前一直都是比较回避 ActiveX 的使用的。由于其不安全性,微软在 NT6 系统中限制了 ActiveX 的调用,导致欲使用第三方的 OCX 必须先注册的X蛋局面。

最近在做 Examer 的开发。由于某种奇怪的原因(其实就是懒,不要在意Σ( ̄。 ̄ノ)ノ,引用了个 Winsock。其实本人也是经过一番考察之后才做出这么个决定的,从 XP 到 7 Windows 貌似都自带了这个组件。当时没有想到其实有些系统没有这个组件(貌似原版 Win 8.1 就没有?)。开发完进行内部测试的时候两台电脑出现了经典的“ActiveX未注册”错误。写了这么长一段其实只是个铺垫,大概看到这里你就知道为什么我发现了下文那个比 ActiveX 还X蛋的方法。

接着讲。于是乎起初我用了 Enigma Virtual Box 把 ActiveX 和程序一起打包。EVB 提供了一个“绿色化”的解决方法,这也是大多数人在遇到这种情况后的解决方法。这样倒是可以用了,不过程序体积貌似大了400多K,看起来略不爽。但是此方法有后遗症:貌似 EVB 打包过的程序不能加壳,而且名为“绿色化”实际上相当于在指定路径(程序路径)释放了打包的组件,然后执行注册,运行完了再删掉。可能我的这个解释有点错误,但是最终的效果的确是这样的。结果就是注册表里面产生了一个无效的 ActiveX 注册信息,其他需要这个组件的正常程序照样报错,还会干扰到以前正常的相同组件的注册信息。Bad End。

经过一番试验,我发现其实 VB 只是在需要用到 ActiveX 的对象加载时才加载它。这样的话就允许程序首先载入没有使用需要组件的对象(或过程),然后抢先一步注册组件。这样运行程序时就不会报错,而且省去了手动注册组件的步骤。

然后就开始写代码。Examer 采用的是界面窗体和 Socket 响应核心分离的设计(其是这种设计没什么其他优势,就是写代码的时候看着方便),刚好在显示初始化信息的时候执行注册过程。于是乎增加一个过程。首先需要判断一下,如果系统已经存在组件的注册信息就不执行注册,直接载入核心。使用 CreateObject(“MSWinsock.Winsock”) 创建一个 Winsock 对象,如果没有注册过组件的话会报个错。基于是否产生错误的角度来决定是否需要注册。注册前在判断下组件是不是在程序目录,没有的话直接弹个提示退出。然后开始执行注册。这里又出现一个判断,用来决定是否需要以管理员身份来注册组件,如果 NT6 就管理员。然后运行 regsvr32 静默注册即可。最好注册完了在 CreateObject 一下看看成功没有,防止弹出那个令人尴尬的错误框框。

貌似就是这样,这个问题得以解决。可能以前有人已经采用过这种方法,不过直到我发现这种方法前还未见到有人公开分享此方法。关于本文思想如有雷同纯属巧合,如有异议欢迎讨论。最后祝自己早日脱团(没可能了吧……

来自旧博客,补档于 2015.1.24

标签: 补档

已有 2 条评论

  1. kkc kkc

    资瓷

    1. 这都被你翻了出来(逃

添加新评论