预先作一个贺卡exe文件(最好用VC,Delphi,应为VB运行库实在太大了,难道你会发一个2M的贺卡给朋友么?),贺卡至作程序只需修改其资源即可,这用API是可以做到的'********************************** '** Function Declarations: #if WIN32 Then Private Declare Function BeginUpdateResource& Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) Private Declare Function EndUpdateResource& Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) Private Declare Function SizeofResource& Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) Private Declare Function UpdateResource& Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) #endif 'WIN32
以下是iProgram在文档中心发的贴子,对你有帮助吗? 从程序中生成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 const picturefilename="filename.pic" public const musicfilename="filename.mus"然后其他如上,在写新文件时find这两个串,改成新文件名
但我需要的是新的思路和方法,我想要真正建立新的EXE
(注:在DOS下曾经这样做个,在windows中应该也可以)
2.要有对可执行文件进行直接修改的能力,我没用过vb,不知道它能不能做到yoursoft(梦郎):
windows下也是这样做,但有很多额外的问题要处理。PE格式虽然没有NE格式那么复杂,但
比dos下的MZ要繁多了
然后生成器产生各种媒体文件使用类似dos中的copy /b的方法把媒体文件添加到文件头后面去。
文件头工作的时候就读取自身,把数据文件分离放到temp目录下面然后开始播放。
用资源文件应该更为方便,但是我不懂得如何修改EXE文件中的资源。
预先做好一个EXE(相当于播放器),把要更改的内容(如图片、音乐等)添加到EXE后。需要播放时,EXE以只读方式打开自己,读取EXE原来长度之后的内容,把这些内容写为另N个文件(可存放到Windows的临时文件夹),这N个文件即为需播放的图片、音乐等,此时EXE就可直接调用这些内容。
'** Function Declarations: #if WIN32 Then
Private Declare Function BeginUpdateResource& Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long)
Private Declare Function EndUpdateResource& Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long)
Private Declare Function SizeofResource& Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long)
Private Declare Function UpdateResource& Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long)
#endif 'WIN32
http://go1.163.com/~blademan/vb/file/other/vb_file_other_001.htm
第二、事先知道欲生成的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
*********************************************8
这是blademan(不累得慢)推荐的文章
谢谢!!
看过之后有几个问题,
1、他所指的资源文件是.rc文件吗???(好象不是),还有如何添加呢??
2、这个程序整体思路的原理是??
3、程序中的一些地方不太明白******************************
我总结一下大家说的方法
1、将修改的信息追加到EXE文件的后面,做成一个文件就可以了????要更改一些界面的属性,一些相应的过程,由用户自定义程序,好象即使对可执行文件的格式很熟悉,也难!!!
2、自己做一个文件头和生成器,然后生成器产生各种媒体文件使用类似dos中的copy /b的方法把媒体文件添加到文件头后面去。文件头工作的时候就读取自身,把数据文件分离放到temp目录下面然后开始播放。(((((可怎么做呢???
3、用资源文件让我这个不懂的家伙看来,好象是最棒的。
可上面的文件不是很清楚,还有jifeng(疾风)你能不能把那几个更改资源的函数详细说说
*************************
还有谢谢各位大侠的参与,真的,很感谢!!我在分数方面是忘不了大家的
我上面所举的贺卡的仅仅是一个例子,,,
我是想设计一个程序,让用户自行设计报表输入界面,并建立新的EXE文件
我使用对INI文件的写入和读取,实现了一些,呵呵!!我将INI文件改名后,骗他们是生成的工程文件,然后由主程序解释执行,,,但我很想知道真正修改EXE文件的方法!!!
从程序中生成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 const musicfilename="filename.mus"然后其他如上,在写新文件时find这两个串,改成新文件名