将两个程序打包成一个
- 格式:docx
- 大小:17.63 KB
- 文档页数:3
C#WinForm应用程序打包步骤总结一、C#WinForm打包工具在已有的Winform方案中添加一个新项目,选择“新建项目”,在弹出对框框,项目类型选择“安装和部署项目”,模板选择“安装项目”或者“安装向导”(建议选择“安装向导”),输入安装项目的名称,路径默认为该方案存放的目录下。
确定后,弹出安装向导的对话框,单击“下一步”,在新对话框选择“创建用于Windows应用程序的安装程序”,单击“下一步”,在新对话框选择“项目输出组”(建议全选),根据提示一步一步进行,可以选择附加文件,最后单击“完成”。
二、打包过程(1)返回开发环境中,在资源管理器中,选择新建立的安装和部署项目,可以看到其详细信息,在“应用程序文件夹”中,选择“主输出……”右键选择“创建主输出……”的快捷方式,创建两个,分别重命名为适当的名称,然后将两个快捷方式分别拖到“用户的程序菜单”和“用户桌面”。
(2)解决方案资源管理器中右键选择该项目的属性,单击“系统必备”按钮,选中.Net Framework 2.0和Windows Installer 3.1 ,将.Net框架打入安装包中,以便在没有安装.Net环境的计算机中正确安装应用程序。
以上操作完成后,可以选中资源管理器中的安装和部署项目,右键选择“重新生成”,将完成打包过程。
打包完成后,到打包文件存放的目录下,可以看到打包的文件,单击exe文件进行安装测试。
安装完成后,在桌面和程序条中都可以看到该项目的启动入口。
三、其他说明1、查看安装目录,可能会有源文件,解决办法就是把打包应用程序文件夹中的“源文件……”和“调试……”两个输出项目删除。
2、在打包设置中,可以设置桌面快捷方式的图标、程序条中的图标等。
3、如果没有选择“安装向导”,一些内容需要手动完成。
4.运行安装包下Debug\setup.exe即可安装.注意:可用以上方法制作安装包(新建部署和安装项目),也可以使用另外一种方法. 即:在在已有的Winform方案中,选择项目的属性,设置”发布”选项卡,也可完成安装包的制作.两种方法的区别:前者(新建部署和安装项目)安装时可更改安装路径,后者不行.。
python最简单的打包方法-回复Python是一种高级编程语言,被广泛应用于软件开发、数据分析和人工智能领域。
在开发Python应用程序时,我们通常会遇到需要将代码打包成可执行文件的场景。
这篇文章将带你一步一步了解最简单的Python打包方法。
打包是将Python代码和相关依赖打包成一个独立的可执行文件。
这样做的好处是可以方便地将应用程序分发给其他人使用,而无需安装Python解释器和相关依赖。
下面是最简单的Python打包方法。
第一步是安装打包工具。
Python有几种不同的打包工具可供选择,如PyInstaller、cx_Freeze和Py2exe等。
本文将以PyInstaller为例进行讲解。
你可以在命令行或终端窗口中使用pip命令安装PyInstaller:pip install pyinstaller安装完成以后,我们可以在命令行或终端中执行`pyinstaller`命令来验证是否安装成功。
如果成功安装,你将会看到一些关于PyInstaller的指令信息。
第二步是准备你的Python代码。
假设你的应用程序代码包含在一个名为`main.py`的文件中。
此外,如果你的应用程序需要一些额外的依赖库,你也需要在代码中使用`import`语句来导入这些依赖。
在编写代码的时候,你需要注意一些与打包相关的细节。
例如,你可能需要指定应用程序的入口点,这个入口点就是程序开始执行的地方。
你需要在代码的顶部使用类似于以下的代码段来指定入口点:pythonif __name__ == '__main__':你的代码此外,还需要确保你的代码是可执行的,并且没有其他错误。
你可以在命令行或终端中运行`python main.py`命令来验证代码是否正常运行。
第三步是使用PyInstaller将代码打包成可执行文件。
在命令行或终端窗口中,使用以下的命令来执行打包操作:pyinstaller main.py执行该命令后,PyInstaller将会分析你的Python代码,收集相关的依赖,并将它们打包成一个可执行文件。
一个APK 捆绑器的实现文/图 海东青利用捆绑器向正常程序捆绑病毒、木马等恶意程序,以达到隐蔽安装、运行的目的,这在Wind ows 平台下是一种很常规的攻击手段。
那么,在智能终端十分流行的今天,如何实现针对手机应用的捆绑器呢?对此,本文针对Android 平台的应用程序APK 文件,给出了类似Wind ows 下捆绑器的实现方案。
原理与基础对任意的两个APK 应用程序A 和B 进行捆绑,并且在手机上安装、运行捆绑生成的APK 程序C 后,仍然具备和A 一样的运行效果,要实现这一目的,捆绑过程可以从两个思路去实现。
1)对Android 应用程序A 进行反编译,通过修改反编译生成的smali 代码,控制执行流程,使其具备安装和执行应用程序B 的功能,最后再打包生成捆绑后的应用C 。
此方法和早期的Wind ows 环境下的PE 病毒类似,插入额外的功能代码,修改入口点改变程序执行流程,最后再回到原有流程执行A 的功能。
2)考虑到A 、B 的任意性,以及生成程序C 的稳定性,在这里重点介绍另外一种通过宿主程序实现释放、安装、运行A 和B 的方法。
其思路亦来自Wind ows 下的捆绑器,即专门写一个host 程序作为宿主,其中应用程序A 、B 作为host 的资源文件,运行host 时可以释放、安装和运行A 和B 的功能。
此外,若考虑到安全性、免杀性,可对A 和B 进行加密、编码。
因此,根据方法2,可得出PC 端和Android 手机端的软件工作流程如图1和图2所示。
图1 PC 端捆绑并生成目标程序的过程黑客防线 w w w .h a c ke r .c o m .cn转载请注明出处图2 Android 手机上,目标程序安装并运行被捆绑的程序的过程功能实现通过上面的介绍,可以知道总共需要实现两个程序,即作为宿主程序的Android 应用host.apk ,以及作为捆绑器的Wind ows 应用程序“捆绑器”,下面将详细介绍这两个程序内部原理和实现方法。
程序打包的原理
程序打包是将一个或多个源代码文件和相关资源文件以某种格式存储
在一个文件中的过程。
这个文件可以被其他程序解压和运行。
1. 源代码文件的压缩:程序打包通常会将源代码文件进行压缩,以
减小文件的大小并节省存储空间。
常见的压缩算法有gzip、zip和tar等。
这些算法通过使用特定的编码方式,将源代码文件中的重复信息进行压缩
存储,从而减小文件的大小。
2.资源文件的存储:除了源代码文件,程序打包还需要包含程序运行
所需的其他文件,例如图像、声音、配置文件等。
这些文件可以直接嵌入
到打包文件中,也可以通过写入指向这些文件的路径信息来引用它们。
3. 打包文件格式:程序打包通常使用特定的文件格式,以便其他程
序可以解压和运行打包的程序。
常见的打包格式有Java的JAR、Python
的whl等。
这些格式在存储打包文件时,会包含一些元数据信息,如应用
程序的入口点、运行依赖等。
4.程序解压和运行:打包的程序需要通过解压操作将文件还原为源代
码文件和资源文件,并执行其中的指令来运行程序。
解压操作可以由特定
的程序解压工具或编程语言的解压函数来完成。
5.版本控制:程序打包还需要考虑程序的版本控制问题。
通常,每次
打包都会生成一个新的版本号,以便在升级或回滚时进行区分。
一些工具
还可以帮助程序员管理不同版本的打包,并支持版本比较和合并操作。
python打包方法
Python打包是将Python代码和它所依赖的库和资源打包成一个可执行文件或安装包的过程。
打包后,用户可以像使用其他可执行文件一样运行Python程序,而不必安装Python解释器或手动安装所有依赖项。
Python打包的方法有很多种,其中比较常用的包括:
1. PyInstaller:这是一个可独立执行Python应用程序的打包工具,它可以将Python代码和所有依赖项打包成一个单独的可执行文件。
PyInstaller支持多平台打包,包括Windows、Linux和Mac OS X等。
2. cx_Freeze:这是另一个Python打包工具,它可以将Python 程序打包成可执行文件或安装包,支持Windows、Linux和Mac OS X 等多平台环境。
3. Py2exe:这是一个专门针对Windows平台的Python打包工具,它可以将Python程序打包成exe文件,用户无需安装Python解释器和依赖库就可以运行程序。
以上是常用的几种Python打包工具,它们都可以将Python程序打包成可执行文件或安装包,方便用户使用和分发。
不同的工具有不同的使用方法和特点,开发者可以根据自己的需求选择合适的打包工具。
- 1 -。
附录打包和发布应用程序在创建Visual Basic应用程序后,您可能希望将该程序发布给其他人。
您可以将使用Visual Basic创建的任何应用程序自由地发布给使用Microsoft Windows的任何人。
可以通过磁盘、CD、网络、或者intranet以及Internet这些途径来发布应用程序。
下面以实例57为例介绍打包和展开应用程序。
一、使用向导进行打包1.启动打包和展开向导Visual Basic的打包和展开向导使您能够轻松地为应用程序创建必需的.cab文件以及安装程序。
与其它向导一样,打包和展开向导将提示您输入相应信息,以便创建您所需要的准确配置。
要从Visual Basic中启动打包和展开向导,请按照以下步骤执行:(1)打开想要使用向导来打包或展开的工程。
注意如果您正在使用一个工程组,或已加载了多个工程,则在启动该向导之前,请确保当前的工程就是您要打包或展开的工程。
(2)如果必要,请使用“外接程序管理器”来加载打包和展开向导:从“外接程序”菜单中选择“外接程序管理器”,从该列表中选择“打包和展开向导”,然后单击“确定”,如图1所示。
图1外接程序管理器(3)从“外接程序”菜单中选择“打包和展开向导”来启动该向导,如图2所示。
打包和展开向导提供了三个选项:“打包”选项帮助您将一个工程的文件打包为一个可以展开的.cab文件,而且在某些情况下还要创建一个安装程序来安装该.cab文件。
向导确定需要打包的文件,并引导您作出所必需的选择,以便为您的工程创建一个或多个.cab文件。
“展开”选项帮助您将打好包的应用程序传送到适当的发布媒体,例如软盘、网络共享、或Web站点。
“管理脚本”选项让您可以查看和操作以前使用打包和展开向导时所保存的脚本。
每次使用该向导时,都会保存一个包含您所做的所有选择的脚本。
在以后的过程中,如果您想使用相似的设置值以及做出与原来相同的选择,就可以重新使用这些脚本。
图2打包和展开向导注意:打包和展开向导只能为Visual Basic应用程序创建安装程序和发布媒体。
前言:当我们用VS或其它编程工具生成了可执行exe要运行它必须要保证其目录下有一大堆dll库文件,看起来很不爽,用专业的安装程序生成软件又显得繁琐,下面这个方法教你如何快速把exe文件和dll文件打包成一个可执行文件,就像我们平时看到的单一绿winrar r 色软件一样,只要双击它,就能运行你的程序,简单,方便,而且只需用最常见的winra 即可完成。
制作前准备:1.电脑上安装winrar,这个工具是最普及的压缩软件,我用的是winrar4.20版本。
2.把的exe文件和其所依赖的dll文件以及你的ico图标放到一个文件夹内步骤如下:一.将所有的文件,包括可执行exe文件和dll库文件以及其它的全选中,鼠标右键单击,选择“添加到压缩文件”二.在“压缩文件名”中填入自己要打包的名称,并勾选“创建自解压格式压缩文件”框。
三.选择“高级”选项卡,单击“自解压选项按钮”四.在“设置”选项卡中,“解压后运行”一栏填上解压后运行的文件,即自己的exe可执行文件名。
当单击你制作的打包程序之后,将自动执行这个文件。
五.在“模式”选项卡中,选中临时模式和全部隐藏单选按钮。
当单击你制作的打包程序之后,你的exe和库文件将被安静地拷贝到一个临时文件夹,并且不会显示进度对话框。
六.在“更新”选项卡中,选中“覆盖所有文件”,当你多次运行你制作的打包程序时候,系统重复解压你的文件到临时文件夹,并且不会询问你是否覆盖。
七.在“文本和图标”选项卡中,在“加载自解压文件图标”处,单击“浏览”按钮,选择你的打包程序的图标。
.自解压微标使用BMP格式文件,自解压文件图标使用ICO格式文件。
当完成这些简单的设置后,双击“确定”,生成你的打包程序你可以移动这个程序(myexe.exe),到其它地方执行了!只需双击,就能运行你的exe文件了。
运行的时候,多此一举的360等安全软件可能会拦截,关掉就OK了。
我也是最近才发现的这个方法,因此把它传到文库里面,供大家浏览和下载,共享技术,祝中国程序员的技术蒸蒸日上(强烈鄙视设置下载要扣分的人!).此方法不一定完美,可能还有更好的方法,希望大家一起来探讨!作者:8月的雨季联系方式:390919875@时间:2013年4月2日11:19:15Copyrigth2013wangkeke。
将python代码打包成⼀个appexe前⾔ 打包的代码通常都需要写⼀个简单的界⾯,⼀般⽤ PyQt 来写。
⽤ PyQt 写界⾯的⽅法请戳这⾥: python提供了⼏个⽤来打包的模块,主要有 py2app、py2exe、pyinstaller,其中第⼀个是⽤来打包来给 mac ⽤的,后两者是针对于 windows 系统。
关于 py2exe 和 pyinstaller 两者的⽐较: 对于 pyinstaller 和 py2exe 两种把 Python ⽂件打包成 exe 可执⾏⽂件的⽅法,都有各⾃的优缺点。
但是最终⽬的都是为了在没有 Python 环境下的普通Windows 系统的电脑中可直接运⾏。
py2exe 的使⽤⽅法基本和 py2app ⼀样,但是本⼈操作时发现在 mac 中⽆法⽤ py2exe 打包成 exe,但是可以⽤pyinstaller 打包成 exe,没有尝试过是否可以在 windows 环境下⽤ py2app 打包成 app。
pyinstaller (-F指令下)⽣成的 exe ⽂件,集成了所需要的所有资源(所以 exe ⽂件相对较⼤),可直接拷贝到其他电脑中使⽤。
对于 py2exe 来说,限制就⽐较多了,它所需要⽤到的外部资源都在 dist ⽬录下,想要在其他电脑中使⽤就必须把整个 dist ⽂件夹都拷贝过去。
⽽且经测试在 64 位机器⽣成的 exe ⽆法在 32 位机器上打开使⽤。
py2app打包注:py2app ⽅法已在 Mac 环境下测试⽆误,windows 环境操作时如果遇到问题请⾃⾏,⼀、安装py2appsudo pip install py2app⼆、进⼊要打包的⽂件所在的⽂件夹cd 。
三、⽣成setup.py⽂件,该⽂件⽤于写打包所需要的依赖py2applet --make-setup xxx.py # xxx.py为项⽬的启动⽂件,之后⽣成的xxx⽂件就是双击执⾏的app⽂件执⾏以后⽬录中会⽣成 setup.py ⽂件,⽤于写⼊依赖的库。
打包的原理打包的原理是指将多个文件或者资源整合到一个文件或者包中的过程。
它在软件开发、网络传输以及数据压缩等各个领域都有广泛的应用。
在打包过程中,主要涉及到文件的收集、组织、压缩和生成目标文件等步骤。
打包的主要目的是为了方便文件的管理和传输。
通过打包,可以将多个相关的文件整合到一个文件中,减少独立文件和目录的数量,从而提高文件的可读性和管理性。
此外,打包还可以减少文件的体积,节省存储空间和传输带宽。
在网络传输中,打包可以将多个小文件打包为一个大文件,减少网络传输的开销,提高传输效率。
打包的过程可以分为以下几个步骤:1. 收集文件:打包过程首先需要收集目标文件,这些文件可以是代码文件、图像文件、音频文件、视频文件等。
收集的文件通常是具有相关性的,例如在软件开发中,可能会收集所有源代码文件和相关的库文件。
2. 组织文件:收集文件后,需要对文件进行组织,确定它们在目标文件中的结构和位置。
通常可以使用文件夹或目录的方式来组织文件。
在组织过程中,可以根据文件的特性(如文件类型、文件大小等)进行分类和划分,以便更好地管理和使用这些文件。
3. 压缩文件:组织完成之后,需要对文件进行压缩,减小文件的体积。
常用的压缩算法有ZIP、RAR、Gzip等。
压缩算法通过消除文件中的冗余信息和使用压缩编码来减小文件的大小。
压缩后的文件可以减少存储空间的占用和传输的时间。
4. 生成目标文件:压缩完成后,可以生成目标文件。
目标文件可以是一个单独的文件,也可以是一个文件夹或者包的形式。
生成目标文件的过程中,需要记录文件的层次结构和目录信息,以便在解包时能够恢复文件的结构和内容。
打包技术的选择取决于具体的应用场景和需求。
在软件开发中,常用的打包技术有Jar(Java Archive)和War(Web Application Archive)等。
Jar文件是Java 平台上的打包文件格式,用于打包Java类文件、资源文件和库文件等。
实例捆绑e x e文件捆绑exe文件的意思是将多个文件打包在一起,合并成一个最终的可执行文件,当运行这个最终的可执行文件时,就相当于运行了合并前的多个可执行文件。
这种程序在木马程序合并中会经常用到,本例就实现两个可执行文件的捆绑,选择两个可执行文件后,程序将其捆绑在一起,生成合并后的文件,运行这个合并后的文件,则两个可执行文件都被运行了。
捆绑可执行文件的基本思想非常简单:首先,用fopen函数建立一个新的二进制文件并先写入捆绑程序的数据和文件长度;其次,写入要捆绑的第一个文件的数据和文件长度;然后,写入要捆绑的第二个文件的数据和文件长度;……最后,写入要捆绑的最后一个文件的数据(不需要长度了,因为长度是为了给各个exe文件定位)。
执行合并文件时,将上面步骤倒过来即可:首先,打开捆绑程序文件,得到文件长度,将文件指针定位到第一个被捆绑文件的位置;其次,读取第一个捆绑文件的长度和数据,将数据写入第一个新建文件中。
同样的读取第二个捆绑文件的长度和数据,将数据写入第二个新建文件中,……读取最后一个捆绑文件的数据,写入最后一个新建文件中。
然后,用Create_Process函数运行这些可执行文件;最后,再删除这些可执行文件即可。
1.利用AppWizard生成一个基于对话框的工程,其他步骤均采用VC的默认配置。
2.由于代码较长,这里只列出主要的函数代码,即捆绑文件的代码和释放文件的代码,其他的程序部分请读者参看程序。
//绑定多个文件为一个可执行文件bool CBindFileDlg::Bind_Files(){FILE* myself; //自身文件FILE* out; //最终合成文件FILE* in; //待绑定文件nt bytesin;nt totalbytes = 0;struct _stat ST;unsigned int finder = 0x12345678;unsigned int i, k;int l=1; //状态显示char buff[20]; //状态显示his_name = strFirstFilePath; //第一个绑定的文件名_stat(my_name, &ST);modify_data.my_length = ST.st_size;if (modify_data.my_length == 0){MessageBox("绑定文件,自身文件长度为零!","错误");return false;}buf = (BYTE *)malloc(modify_data.my_length);if (buf == NULL){MessageBox("绑定文件,分配自身文件长度失败!","错误");return false;}myself = fopen(my_name, "rb"); //打开自身文件if (myself == NULL){free(buf);MessageBox("绑定文件,打开自身文件时失败!","错误");return false;}bytesin = fread(buf, 1, modify_data.my_length, myself);fclose(myself);if (bytesin != modify_data.my_length){free(buf);MessageBox("绑定文件,全读取自身文件失败!","错误");return false;}for (i = 0; i < modify_data.my_length - sizeof(finder); i += sizeof(finder)) {for (k = 0; k < sizeof(finder); k++){if (buf[i+k] != ((BYTE*)&finder)[k])break;}if (k == sizeof(finder)) //定位并保存自身数据文件大小{memcpy(buf+ i, &modify_data, sizeof(modify_data));break;}}if (i >= modify_data.my_length - sizeof(finder)){free(buf);MessageBox("绑定文件,定位自身文件失败!","错误");return false;}if (_stat(strFirstFilePath, &ST) != 0 || ST.st_size == 0){free(buf);MessageBox("绑定文件,读取要绑定文件失败!","错误");return false;}list_my_icons();out = fopen(strFinalFilePath, "wb"); //创建最终合成文件if (out == NULL)第4章时间控制{free(buf);MessageBox("绑定文件,创建合成文件失败!","错误");return false;}totalbytes += fwrite(buf, 1, bytesin, out);in = fopen(strFirstFilePath, "rb"); //打开第一个要绑定的文件if (in == NULL){free(buf);MessageBox("绑定文件,打开要绑定文件失败!","错误");return false;}//写入第一个要绑定文件的长度到合成文件中totalbytes += fwrite(&ST.st_size, 1, sizeof(ST.st_size), out);//写入最终分解后文件执行方式的标志位(同步或异步执行) UpdateData(TRUE); //传控件值到变量m_Sync中totalbytes += fwrite(&m_Sync, 1, sizeof(int), out);while (bytesin = fread(buf, 1, modify_data.my_length, in)){totalbytes += fwrite(buf, 1, bytesin, out);}fclose(in); //关闭第一个绑定文件句柄//设置进度条显示m_Progress.SetRange(0,500);for (int m = 0; m < 500; m++)m_Progress.SetPos(m);m_Parts = _ltoa(l, buff, 10);m_Parts += _T("个文件已绑定");UpdateData(FALSE);l++;in = fopen(strSecondFilePath, "rb"); //打开第二个要绑定的文件if (in == NULL){free(buf);MessageBox("绑定文件,打开要绑定文件失败!","错误");return false;}while (bytesin = fread(buf, 1, modify_data.my_length, in)){totalbytes += fwrite(buf, 1, bytesin, out);}//设置进度条显示m_Progress.SetRange(0,500);for (int n = 0; n < 500; n++)m_Progress.SetPos(n);m_Parts = _ltoa(l, buff, 10);m_Parts += _T("个文件已绑定");UpdateData(FALSE);l++;fclose(in); //关闭第二个绑定文件句柄fclose(out); //关闭最终合成文件句柄free(buf); //释放缓冲区return true;}释放合并文件的函数如下:void CBindFileDlg::Unbind(){FILE* myself; //自身文件FILE* out; //分解后文件int bytesin;int totalbytes = 0;char temp_exe1[] = "temp1.exe"; //分解后的绑定文件名一char temp_exe2[] = "temp2.exe"; //分解后的绑定文件名二int SyncFlag; //文件最终执行标志buf = (BYTE*)malloc(modify_data.my_length);myself = fopen(my_name, "rb"); //打开最终合成文件if (myself == NULL){free(buf);MessageBox("分离文件,打开自身文件失败!","错误");return;}out = fopen(temp_exe1, "wb"); //创建第一个绑定的文件if (out == NULL){free(buf);MessageBox("分离文件,创建被绑定文件失败!","错误");return;}//将文件指针定位到捆绑器程序长度尾部fseek(myself, modify_data.my_length, SEEK_SET);//读取第一个绑定文件的长度if (fread(&prog1_length, sizeof(prog1_length), 1, myself) == 0){free(buf);MessageBox("分离文件,读取被绑定文件长度失败!","错误");return;}//读取最终文件执行方式(同步或异步执行)if (fread(&SyncFlag, sizeof(int), 1, myself) == 0){free(buf);MessageBox("分离文件,读取被绑定文件长度失败!","错误");return;}//读取第一个文件内容并写入while (bytesin = fread(buf, 1, sizeof(buf), myself)){if (totalbytes + bytesin > prog1_length)bytesin = prog1_length - totalbytes;totalbytes += fwrite(buf, 1, bytesin, out);}//关闭第一个绑定文件句柄第4章时间控制fclose(out);#ifdef DEBUG_PRINTfprintf(stderr, "已复制%d 字节!\n", totalbytes);#endif DEBUG_PRINTtotalbytes = 0;out = fopen(temp_exe2, "wb"); //创建第二个绑定的文件if (out == NULL){free(buf);MessageBox("分离文件,创建第二个被绑定文件时出错!","错误");return;}//将文件指针定位到最终合成文件中的第二个绑定文件头部, 偏移量==//(捆绑器自身文件长度+保存第一个绑定文件长度所占字节数+//保存最终文件执行标志所占字节数+第一个绑定文件长度)fseek(myself, modify_data.my_length + sizeof(modify_data.my_length) + sizeof(int) + prog1_length, SEEK_SET);//读取第二个绑定文件内容并写入while (bytesin = fread(buf, 1, sizeof(buf), myself)){totalbytes += fwrite(buf, 1, bytesin, out);}//关闭第二个绑定文件句柄fclose(out);#ifdef DEBUG_PRINTfprintf(stderr, "已复制%d 字节\n", totalbytes);#endif DEBUG_PRINT//关闭最终合成文件句柄fclose(myself);if (totalbytes == 0){free(buf);MessageBox("分离文件,没有被分离的对象!","错误");return;}free(buf); //释放缓冲区if(!SyncFlag) //0 -- 同步执行,1 -- 异步执行{//置为分解后,为同步执行方式Create_Process(temp_exe1, false);Create_Process(temp_exe2, false);}else{//置为分解后,为异步执行方式Create_Process(temp_exe1, true);Create_Process(temp_exe2, true);}}。
将两个程序打包成一个
问:我有几个程序分布在客户机中,我需要增加一个模块来增加对用户的判别.用户
每次运行这个程序时都先运行这个程序.而这几个程序不是用VC开发的,所以我想
法将这些程序与我的代码打包成一个.exe文件,如何实现它?
答:1)简单的说,将老的程序作为一个二进制资源插入到你的程序中,然后先执行
你的需要,再将这个二进制资源作为一个可执行文件写到磁盘上,然后再执行这
个程序。
同样的方法,你也可以加两个程序等等。
2)使用COM就可以完成,但你必须要改写主程序的InitInstance或者ExitInstance。
有许多 ansi和win32函数可以独立运行你的程序。
将应用程序调用的外部数据文件集成到程序可执行文件中
我们知道,Windows应用程序中包括执行代码和程序资源两部分。
例如,应用
程序的位图、图标、对话枢、字串表等都被存储在应用程序资源中。
对于处在应用程序外部的多个小数据文件,一方面容易丢失从而将造成程序出错,另一方面也存在安全性和保密性不强等弊端。
因此,可考虑将其集成到程序可执行文件中,这样还可以加快数据的读取速度。
实现这种功能有两个关键步骤:首先,将这些文件作为程序资源放进资源文件中;然后,在程序执行数据文件加载时,从资源内存中读取这些文件。
1、将数据文件加到资源文件中
(1)首先用文本编辑器(记事中、写字板等)打开资源文件,即带有rc扩展名的
文件(注意:此处只能用文本编辑器打开,因为在VisualC++ 5。
0的资源编辑器中
不支持除加速键表、位图、对话框、光标、图标、菜单、工具条、串表、版本信息等标准资源外的非标准资源的插入。
为安全起见,在进行下述操作时要先备份资源文件),然后添加如下儿行代码:
////////////////////////////////////////////////
///////////////////////////////DATA
IDR_DATA0 DATA DISCARDABLE "res\\data0.dat"
IDR_DATA1 DATA DISCARDABLE "res\\data1.dat"
IDR_DATA2 DATA DISCARDABLE "res\\data2.dat"
IDR_DATA3 DATA DISCARDABLE "res\\data3.dat"
上述资源文件代码中: IDR_DATA0为数据文件的资源ID号, DATA为资源类名
,DISCARDABLE表示该资源是可抛弃型的,而“res\\data0.dat”表示数据文件
data0.dat处于当前工程文件所处文件夹下的res子文件夹中,供应用程序编译连
接时加载数据用。
不要改动其它的地方,保存文件并退出。
(2)然后在Visual C++5.0的资源编辑器中打开资源文件,将能看到以“DATA ”标识的资源文件下面有四项,分别以“IDR—DATA0”、……、“IDR DATA3”等
标识。
用鼠标任意单击它们,就会看到相应的二进制数据显示出来。
为了在程序中应用这些ID号,还必须进一步修改。
方法是:选择“IDR_DATA0”,中击鼠标右
键,在弹出的快捷菜单中选择属性页(properties),将ID名称修改为IDR_DATA0( 即去掉双引号)。
其它依此类推。
2、从资源内存块续取数据
读取数据的关键在于:首先要获得具有所需资源ID号的资源内存块地址指针
,然后根据不同的数据类型对地址指针进行强制类型转换。
获得具有所需资源ID
号的资源内存块地址指针主要包括以下几个步骤:
(1)首先获取当前应用程序.EXE的文件句柄,该句柄用于在.EXE文件中寻找资源
HMODULE ghmDdule = GetModuleHandle(NULL);
(2)接着用以上获得的应用程序文件句柄ghmodule作为参数之一来寻找具有指
定资源ID和指定资源类型的资源文件中的资源位置,返回值为有名称的资源:
HRSRC hr = FindResource(ghmodule, MAKEINTRESOURCE(resourseID), "PLANE");
(3)然后从ghmodule标识的可执行文件中装人hr所指定的资源,该函数返回值
标识了用于接受资源数据的全局数据块:
HGLOBAL hg = LoadResource(ghmodule, hr);
(4)最后锁定hg所标定的内存块,并返回所标定内存块的虚拟内存地址。
如果
该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:
LPVOID pv = (PSZ) LockResource(hg)
注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。
接下去要做的事情就是根据文件数据类型进行数据加载,此处不再赘述。
相应的代码段如下所示,其中pv指针指向内存块的第一个字节,为单字节指
针。
因此,应该根据数据文件的类型结构对指针进行强制类型转换,并不断修改指针,使其指向下一个待读的数据中元。
BOOL LoadDataFromResource(WORD resourceID)
{
HMODULE dhmodule = GetModuleHandle(NULL);
HRSRC hr = FindResource(ghmodule,MAKEINTRESOURCE(resourseID),"DATA"); if (hr==NULL)
{
return FALSE;
HGLOBAL hg=LoadResource(ghnodule,hr);
if(hr==NULL)
{FreeResource(hr); return FALSE;}
LPVOID pv=(PSZ)LockResource(hg);//pv指向内存块的第一个字节,为单字节指针
if (pv==NULL)
{FreeResource(hr); return FALSE;}//read data from resoure (memory block) intnum,*pInt=(int *)pv;
num=*(pInt++);
doublefd,*pDouble=(double *)pInt;
fd=*(pDouble++);............
return TRUE;
}。