[以下转贴,我没有验证,仅供参考] 从程序中生成Exe文件 这篇文章要讨论的是在一个VB程序中如何产生出另一个Exe文件。 要实现这个目的,必须符合以下几个条件: 第一、编写这样的程序时,具备欲生成的Exe文件 第二、事先知道欲生成的Exe文件大小 其实这两个条件可以说不是条件,但确实很重要。 为了叙说方便,将发行的程序称作APP-1.Exe,要生成的文件叫APP-2.Exe,以下是具体步骤: 第一步,准备好APP-2.Exe,这里我使用VB写了一个什么都不做程序,编译成APP-2.Exe。 第二步,右键单击单击APP-2.Exe,选择属性,记下文件大小。注意,应记下以字节为单位的具体数字,而不是多少k。 这样就具备了前边说的两个条件。 第三步,新建工程APP1,新建资源文件加入工程,在资源文件编辑器中添加自定义资源(CUSTOM),资源号使用默认的101。值得注意的是,每个资源号对应的资源项对资源大小的要求是有限制的,我记得时64K,因此如果APP-2.Exe的大小如果大于这个数的话,就要麻烦一些。如果是这样,我们的写另一个程序,把APP-2.Exe一个字节一个字节的读出来,每64K生成一个文件,然后再把这些文件分别写道资源文件的101、102......资源项中,代码也要作相应的修改。 第四步,为APP-1.Exe编写代码,使其读取资源文件的数据,生成APP-1.Exe。 代码如下: Private Const FILESIZEOFAPP2 = 20480 '我生成的APP-2.Exe大小是20480Byte Private Sub cmdOK_Click() '单击按钮cmdOK运行代码 Dim APP2() As Byte 'APP2是个Btye类型和数组 Dim Counter As Long APP2 = LoadResData(101, "CUSTOM") '将自定义资源中101号资源读入数组 '注意,微软的帮助中对加载定义资源的说明有误,硬是资源标识为"CUSTOM"而非数字 If Dir(App.Path & "\APP-2.Exe") <> "" Then '第一次按cmdOK有效 MsgBox App.Path & "\APP-2.Exe 已经存在!" Exit Sub End If Open App.Path & "\APP-2.exe" For Binary As #1 '以二进制方式写(生成)APP-2.Exe到APP-1.Exe所在的目录 For Counter = 0 To FILESIZEOFAPP2 - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终 Put #1, , APP2(Counter) Next Counter Close #1 Shell App.Path & "\APP-2.Exe", vbNormalFocus '运行刚生成的APP-2.Exe Unload Me End Sub
从资源文件释放exe不用记什么大小的,那多麻烦,且不灵活,如下: '从资源文件中读出数据并另存为磁盘文件 Public Sub resDataFile(Id, resType, FileName As String) Dim resFile() As Byte, FileNum As Integer On Error GoTo Err2 resFile = LoadResData(Id, resType) FileNum = FreeFile Open FileName For Binary Access Write As #FileNum Put #FileNum, , resFile Close #FileNum Exit Sub Err2: MsgBox Err.Description & ":" & Err.Number, vbInformation, "错误" End Sub'调用方式 Private Sub Command1_Click() Call resDataFile( 101, "CUSTOM", "APP-2.exe" ) End Sub
不能说是捆绑 应该说是嵌套 把EXE放入资源文件中 满足条件后释放 用VB做的东西杀毒是查不出来的 那个资源文件除外 下面是一个简单的例子: Private Sub Form_Load() Dim TAO() As Byte Dim i As Long '条件判断 真则继续 否则END If Dir(App.Path & "\11.exe") <> "" Then'欲释放的程序已存在 则直接运行后中断主程序的运行 Shell App.Path & "\11.Exe", vbNormalFocus Unload Me End If '不存在则从资源文件里释放 TAO = LoadResData(101, "CUSTOM") '将自定义资源中101号资源读入数组TAO On Error GoTo 1 Open App.Path & "\11.exe" For Binary As #1 '写资源文件到当前路径 For i = 0 To 11111- 1 '这里的11111是被嵌套的Exe文件字节数(大小) Put #1, ,TAO(i) Next i Close #1 Shell App.Path & "\11.Exe", vbNormalFocus '运行刚生成Exe 1 Unload Me End Sub
[以下转贴,我没有验证,仅供参考]
从程序中生成Exe文件
这篇文章要讨论的是在一个VB程序中如何产生出另一个Exe文件。
要实现这个目的,必须符合以下几个条件:
第一、编写这样的程序时,具备欲生成的Exe文件
第二、事先知道欲生成的Exe文件大小
其实这两个条件可以说不是条件,但确实很重要。
为了叙说方便,将发行的程序称作APP-1.Exe,要生成的文件叫APP-2.Exe,以下是具体步骤: 第一步,准备好APP-2.Exe,这里我使用VB写了一个什么都不做程序,编译成APP-2.Exe。
第二步,右键单击单击APP-2.Exe,选择属性,记下文件大小。注意,应记下以字节为单位的具体数字,而不是多少k。
这样就具备了前边说的两个条件。
第三步,新建工程APP1,新建资源文件加入工程,在资源文件编辑器中添加自定义资源(CUSTOM),资源号使用默认的101。值得注意的是,每个资源号对应的资源项对资源大小的要求是有限制的,我记得时64K,因此如果APP-2.Exe的大小如果大于这个数的话,就要麻烦一些。如果是这样,我们的写另一个程序,把APP-2.Exe一个字节一个字节的读出来,每64K生成一个文件,然后再把这些文件分别写道资源文件的101、102......资源项中,代码也要作相应的修改。 第四步,为APP-1.Exe编写代码,使其读取资源文件的数据,生成APP-1.Exe。 代码如下: Private Const FILESIZEOFAPP2 = 20480 '我生成的APP-2.Exe大小是20480Byte
Private Sub cmdOK_Click() '单击按钮cmdOK运行代码
Dim APP2() As Byte 'APP2是个Btye类型和数组
Dim Counter As Long
APP2 = LoadResData(101, "CUSTOM") '将自定义资源中101号资源读入数组
'注意,微软的帮助中对加载定义资源的说明有误,硬是资源标识为"CUSTOM"而非数字
If Dir(App.Path & "\APP-2.Exe") <> "" Then '第一次按cmdOK有效
MsgBox App.Path & "\APP-2.Exe 已经存在!"
Exit Sub
End If
Open App.Path & "\APP-2.exe" For Binary As #1 '以二进制方式写(生成)APP-2.Exe到APP-1.Exe所在的目录
For Counter = 0 To FILESIZEOFAPP2 - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终
Put #1, , APP2(Counter)
Next Counter
Close #1
Shell App.Path & "\APP-2.Exe", vbNormalFocus '运行刚生成的APP-2.Exe
Unload Me
End Sub
Public Sub resDataFile(Id, resType, FileName As String)
Dim resFile() As Byte, FileNum As Integer
On Error GoTo Err2
resFile = LoadResData(Id, resType)
FileNum = FreeFile
Open FileName For Binary Access Write As #FileNum
Put #FileNum, , resFile
Close #FileNum
Exit Sub
Err2: MsgBox Err.Description & ":" & Err.Number, vbInformation, "错误"
End Sub'调用方式
Private Sub Command1_Click()
Call resDataFile( 101, "CUSTOM", "APP-2.exe" )
End Sub
把EXE放入资源文件中 满足条件后释放
用VB做的东西杀毒是查不出来的 那个资源文件除外
下面是一个简单的例子:
Private Sub Form_Load()
Dim TAO() As Byte
Dim i As Long
'条件判断 真则继续 否则END
If Dir(App.Path & "\11.exe") <> "" Then'欲释放的程序已存在 则直接运行后中断主程序的运行
Shell App.Path & "\11.Exe", vbNormalFocus
Unload Me
End If
'不存在则从资源文件里释放
TAO = LoadResData(101, "CUSTOM") '将自定义资源中101号资源读入数组TAO
On Error GoTo 1
Open App.Path & "\11.exe" For Binary As #1 '写资源文件到当前路径
For i = 0 To 11111- 1 '这里的11111是被嵌套的Exe文件字节数(大小)
Put #1, ,TAO(i)
Next i
Close #1
Shell App.Path & "\11.Exe", vbNormalFocus '运行刚生成Exe
1
Unload Me
End Sub
放资源文件里是vb6里最经典的解决办法了,不知道象人家ASPACK等加壳软件怎么做的?
http://www.bjjr.com.cn/yefan/sourcecode/runfile.rar