我想把控件写入程序中,在没有这个控件的机器上也能使用程序,这段代码却实现不了,非得将控件和.exe文件放在一起!不知道怎么改?
Private Const OCXSIZE = 147456Sub main()    Dim ocx() As Byte
    Dim counter As Long
    'LoadResDataº¯ÊýÊÇÓÃÒÔ´Ó×ÊÔ´ (.res) Îļþ×°ÔØÈô¸É¿ÉÄÜÀàÐ͵ÄÊý¾Ý£¬²¢·µ»ØÒ»¸ö Byte Êý×é
    ocx = LoadResData(101, "custom")
'    ¶ÁÈ¡³ÌÐòËùÔÚ·¾¶ , ÅжÏÊÇ·ñΪ¸ùĿ¼²¢·Ö±ð´¦Àí
    If Right(App.Path, 1) = "\" Then
'        ³ÌÐò·¾¶ÏÂÓÐÎ޿ؼþ , ÎÞÔòÉú³É¿Ø¼þ
        If Dir(App.Path & "command.ocx") = "" Then
            Open App.Path & "Command.ocx" For Binary As #1
            For counter = 0 To OCXSIZE - 1
                'put·½·¨Êǽ«Ò»¸ö±äÁ¿µÄÊý¾ÝдÈë´ÅÅÌÎļþÖÐ
                Put #1, , ocx(counter)
            Next counter
            Close #1
        End If
    End If
    frmServer.Visible = True
    
End Sub

解决方案 »

  1.   

    代码再发一次!
    Private Const OCXSIZE = 147456
    Sub main()
        Dim ocx() As Byte
        Dim counter As Long
        ocx = LoadResData(101, "custom")
        If Right(App.Path, 1) = "\" Then
            If Dir(App.Path & "command.ocx") = "" Then
                Open App.Path & "Command.ocx" For Binary As #1
                For counter = 0 To OCXSIZE - 1
                    Put #1, , ocx(counter)
                Next counter
                Close #1
            End If
        End If
        frmServer.Visible = True
        
    End Sub
      

  2.   

    http://www.sijiqing.com/vbgood/experience/index.asp?action=read&id=3721
    二、 实现“绿色”软件
    现在非常流行“绿色”软件,不需要什么安装程序只要一个 EXE 文件就可以运行程序
    了,而在 VB 的编程中有许多地方需要调用第三方的控件(很难用 API 函数搞定所有的功能),这就需要制做一个安装程序,把所需要的控件、DLL 文件或其他文件打包进去了,那么在 VB 中怎么用变通的方法实现“绿色”软件呢,请看:
    示例:
    1、主程序.EXE
    用 VB6.0 编写的程序,调用了 Winsock 控件,如果在没有安装 VB5.0、6.0 的机器上运行则会出现错误,导致程序运行失败,这时如果按一般的方法,只有把这个程序用 VB5.0、6.0 的安装程序进行打包,不然只有用用2的方法来解决了。
    2、注册程序.EXE
    用 VB6.0 编写的程序,使用资源文件的方法,把 Winsock 控件封装到本程序中,在运行主程序.EXE之前,先运行本程序,通过 API 函数 GetSystemDirectory 取得系统的 Winddows\System 的目录,然后把 Winsock 控件复制到该目录下,并用 Shell 来完成控件的注册。
    ⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
    ⑵在 VB 资源编辑器窗口中,点击“添加自定义资料”,增加 Winsock 控件(C:\Winddows\System\Mswinsck.ocx),再双击刚刚创建的自定义资源,弹出”编辑属性”窗口,定义如下:
    类型: “OCX”
    标识号: 101
    语言: 中文(中国)
    ⑶保存资源文件,写如下代码:
    Option Explicit
    Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
    Const MAX_PATH = 260  注释:定义足够长的字符串
    Private Sub Form_Load()
    Dim TempFile() As Byte
    Dim FileNum As Integer
    Dim TempDir As String
        TempDir = GetWinSysDir 注释:自定义函数取得系统的 Winddows\System 的目录
        TempFile = LoadResData(101, "OCX") 注释:用以从资源 (.res) 文件装载若干可能类型的数据,并返回一个 Byte 数组
        FileNum = FreeFile
        Open TempDir & "\Mswinsck.ocx" For Binary Access Write As #FileNum 注释:新建文件(把 Winsock 控件复制到指定目录下)
            Put #FileNum, , TempFile
        Close #FileNum
        
        注释:Shell "regsvr32 " & TempDir & "\Mswinsck.ocx ", vbNormalFocus 注释:注册控件,有弹出对话框
        Shell "regsvr32 " & TempDir & "\Mswinsck.ocx /s", vbNormalFocus 注释:注册控件,无弹出对话框
        
        MsgBox "注册成功,现在本程序可正常运行了!!", vbOKOnly, "注册控件"
        
        Unload Me
    End SubPublic Function GetWinSysDir() 注释:定义读取Winddows\System 的所在目录的函数
    Dim S As String, Length As Long
    S = String(MAX_PATH, 0) 注释:赋值
    Length = GetSystemDirectory(S, MAX_PATH)   注释:S为取得目录,MAX_PATH 为长度
    S = Left(S, InStr(S, Chr(0)) - 1) 注释:去掉多余的空格
    GetWinSysDir = S
    End Function
    注释:补充:S 和 MAX_PATH 的值是可以随便赋的,
    注释:如: Dim S As String * 20
    注释:    Length = GetSystemDirectory(S, 20)
    3、补充说明
    在用 VB6.0 保存上述两个程序后,请再使用 VB5.0 重新打开这两个程序,并编译为主程序.EXE、注册文件.EXE。(用 VB5.0 编译的程序,在 Win98、2000 下不需要任何 DLL 文件) 
    程序运行
    4、程序运行
    将主程序.EXE、注册文件.EXE两个文件,复制到任意机器上,先运行注册文件.EXE注册第三方的控件,再运行主程序.EXE,就不会有任何的错误了,一个变通的“绿色”软件就完成了。