飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3690|回复: 8

VB将OCX植入执行文件内

[复制链接]
  • TA的每日心情
    难过
    2024-4-22 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2005-12-21 21:29:50 | 显示全部楼层 |阅读模式
    在用VB编程中合理的使用第三方控件,往往能够事半功倍。但是使用第三方控件也有不好的地方,那就是为了保证程序正常运行,必须使程序能够在系统目录或程序目录下找到所用的第三方控件。要做到这一点通常有两种办法:一是把控件和程序制成一个压缩包发行,这样的缺点是有可能导致在程序传播过程中丢失控件文件。二是制作安装程序,缺点是制作过程烦琐。而且上面两种办法也不符合绿色软件的要求。所谓的绿色软件是指软件只有单个可执行文件且无须安装,目前很受用户欢迎。那么有没有办法在使用了第三方控件的情况下实现绿色软件梦呢?答案是有。

      做法是,将第三方控件以自定义资源文件方式保存在程序中,程序运行之后使用控件之前将所用到的控件生成到该程序目录下,完成控件从可执行文件中的金蝉脱壳

      具体做法如下:

      第一步:将要用到的控件拷贝到当前工程目录下,右键单击该控件,选择属性,记下文件大小。注意,应记下以字节为单位的具体数字,而不是多少K,以备编程使用。

      第二步:引用并正常使用该控件。

      第三步:新建资源文件加入工程,在资源文件编辑器中添加所使用的第三方控件为自定义资源(CUSTOM),资源号使用默认的101。如果使用了多个控件则分别添加到资源文件的101、102......资源项中,脱壳代码也要作相应的修改。

      第四步:编写控件脱壳代码,使其读取资源文件的数据,在程序当前目录下生成控件。

      代码如下:

    Private Const OCXSIZE = 57344 '欲生成的控件大小是57344Byte,名字为CoolToolBar.ocx

    Sub Main()
     Dim Ocx() As Byte 'OCX是个Btye类型的数组
     Dim Counter As Long
     Ocx = LoadResData(101, "CUSTOM") '将自定义资源中101号资源读入数组OCX
     '注意,微软的帮助中对加载自定义资源的说明有错误,自定义资源标识为"CUSTOM"而不是帮助所说的数字10

     If Right(App.Path, 1) = "($%$43%^#ASD#2@$#f$%^) Then '读取程序所在路径,判断是否为根目录并分别处理
      '程序在根目录下
      If Dir(App.Path & "CoolToolBar.ocx") = "" Then '程序路径下有无控件,无则生成控件
       '以二进制方式写(生成)控件(CoolToolBar.ocx)到主程序所在的目录
       Open App.Path & "CoolToolBar.ocx" For Binary As #1
       For Counter = 0 To OCXSIZE - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终值
        Put #1, , Ocx(Counter)
       Next Counter
       Close #1
      End if
     Else
      '程序不在根目录下
      If Dir(App.Path & "\CoolToolBar.ocx") = "" Then '程序路径下有无控件,无则生成控件
       '以二进制方式写(生成)控件(CoolToolBar.ocx)到主程序所在的目录
       Open App.Path & "\CoolToolBar.ocx" For Binary As #1
       For Counter = 0 To OCXSIZE - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终值
        Put #1, , Ocx(Counter)
       Next Counter
       Close #1
      End if
     End if
     Form1.Visible = True '主程序所用控件已经生成,显示主窗体,进入主程序。
    End Sub  

      注意:将以上代码作为一个模块添加到工程中,并在工程-工程属性设置中将启动对象选为Sub Main,即上面的脱壳代码。然后编译生成EXE文件,将该EXE文件拷贝到其他没有安装所用控件的计算机上运行一下看看是否实现了控件携带之金蝉脱壳。如果是那么OK!以上为使用一个控件的情况,使用多个控件方法基本相同,不在赘述。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-2-11 00:20:04 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-20 20:06
  • 签到天数: 258 天

    [LV.8]以坛为家I

    发表于 2006-2-12 20:24:45 | 显示全部楼层
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-2-27 20:52:07 | 显示全部楼层
    谢谢,。。。。。
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2024-2-4 11:15
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2006-3-19 20:27:51 | 显示全部楼层
    此法甚好,值得学习。
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-7-18 14:10
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2006-9-9 08:51:52 | 显示全部楼层
    此法甚好,值得学习。
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-7-18 14:10
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2006-9-9 08:54:42 | 显示全部楼层
    此法甚好,值得学习。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-9-9 09:38:25 | 显示全部楼层
    这个方法的确是不错啊,支持了
    PYG19周年生日快乐!
    秋风下的落叶 该用户已被删除
    发表于 2006-9-9 18:13:22 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表