想做成可执行文件直接在未安装Ocx文件的电脑上执行。
在网上搜索了一下,发现有:
    第一步:将要用到的控件拷贝到当前工程目录下,右键单击该控件,选择属性,记下文件大小。注意,应记下以字节为单位的具体数字,而不是多少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!以上为使用一个控件的情况,使用多个控件方法基本相同,不在赘述。
请问第三步:在资源文件编辑器中添加所使用的第三方控件为自定义资源(CUSTOM),这怎么加?能不能具体点(在哪个菜单)?有没有其他好的办法?

解决方案 »

  1.   

    如果要用Resource Editor,你的vb6必须是Enterprise Edition。其他好方法就是自己写一个注册OCX/DLL的批次档,让用户自行运行。
      

  2.   

    现已解决在资源文件编辑器中添加所使用的第三方控件为自定义资源(CUSTOM),但如下语句出错:
    If Right(App.Path, 1) = "($%$43%^#ASD#2@$#f$%^) Then '读取程序所在路径,判断是否为根目录并分别处理 
     估计"($%$43%^#ASD#2@$#f$%^) 错误,但我看了几个网页,都是这样。应该是什么?
      

  3.   


    我感觉这一段是多余的。直接在 App.path 底下生成OCX就可以了。或者指定在 C:\Windows\System32 生成。如果要确定这个OCX是否存在,可以用以下代码:If Len(Dir("C:\Windows\System32\ABCDEF.OCX")) > 0 Then
       '档案存在,不需要生成OCX
    else
       '档案不存在,必须生成OCX
    End if
      

  4.   

    终于解决!引入了API函数读Windows系统目录:Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
    Private Const OCXSIZE = 662288 '欲生成的控件大小是662288Byte,名字为MSCOMCT2.OCX
    Const MAX_LEN = 200Sub Main()
        Dim Ocx() As Byte 'OCX是个Btye类型的数组
        Dim Counter As Long
        Dim sTemp As String * MAX_LEN
        Dim SysDir As String
        Length = GetSystemDirectory(sTemp, MAX_LEN)
        SysDir = Trim(Replace(sTemp, Chr(0), ""))  '获取系统目录
        If Dir(SysDir + "\MSCOMCT2.OCX") = "" Then '文件已存在则不需新建,跳过
            Ocx = LoadResData(101, "CUSTOM") '将自定义资源中101号资源读入数组OCX
            Open SysDir + "\MSCOMCT2.OCX" For Binary As #1
            For Counter = 0 To OCXSIZE - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终值
                Put #1, , Ocx(Counter)
            Next Counter
            Close #1
        End If
        Form1.Visible = True '主程序所用控件已经生成,显示主窗体,进入主程序。
    End Sub
    还是在Windows系统目录下生成比较好,因为软件有时是放到桌面运行的,运行时添加到桌面不好.
    给10分吧,每人一半,请笑纳。