|
![]() | 作者: cailman [cailman]
![]() |
登录 |
我用VB编了一个小程序,生成的exe文件也不过几百K而已.,因为用了Data控件,所以直接生成的exe在没有装VB的机上不能运行,我用企业版的打包工具生成一个安装程序,问题是解决了,但安装程序居然有10M之大. 请问哪位高手知道是怎么回事,如何解决? |
地主 发表时间: 10/21 14:25 |
![]() | 回复: ceo_8008 [ceo_8008] ![]() |
登录 |
你说什么我不大清楚 VB也没去学习过 不过你第一句说:生成的exe文件不过几百K而已 后来又说安装程序居然10M之大,这有矛盾吗? |
B1层 发表时间: 10/21 15:53 |
![]() | 回复: 286 [unique] ![]() |
登录 |
因为安装程序要把几个必须用到的动态链接库加进去。 没有太好的解决办法,(如果有,Micro$oft也不会这样作让我们骂了。)不过你可以把那个库找到并压缩后以文件的形式向对方提供,运行时把那个几库和可执行文件放到相同目录中或windows系统目录中即可。 |
B2层 发表时间: 10/21 16:53 |
![]() | 回复: cailman [cailman] ![]() |
登录 |
以下是我从网上找到的相关文章 也许对大家有用 用VB的安装向导做出来的安装文件太大 Visual Basic - 制作安装程序 saturn: vb5.0 Windows95 用VB的安装向导做出来的安装文件太大,我的源程序只有300K,但用过安装向导后,有6M之多, 有什么更好的方法? 回答: 这是VB的缺点,也是简单易学的代价。一般最简单的VB程序的安装盘也要将近2M。你可以看 看你的项目文件中是否包括了根本没有使用的控件,如果有从项目文件中删除掉。另外,如果你 的程序是数据库程序,删除掉你根本不使用的数据库格式,这也可以减小文件大小。 相关问题: QA002680 "一个非常简单的VB程序不制作安装程序是否可以" 曹春鹏的意见: 解决VB6安装程序过大的一个办法: 用VB6编译成的EXE文件,运行时需要一个‘运行时’文件,即VB运行库.在VB6里是 MSVBVM60.DLL在VB5里是MSVBVM50.DLL,VB5的这个文件在WIN98里是操作系统自代的(主持人注: Win95/NT 4.0不包括此文件,Win2000包括)。而VB6则没有,在用VB6的“Package & Deployment 向导”做安装程序时会自动打进去。以上这些都不是问题,麻烦的是如果你在VB中用了‘数据库 访问’组件,比如ADO和RDS,那么那个“Package & Deployment 向导”会给你打入一个 Mdac_typ.exe文件在里面,这是一个自解压文件,它有6M多。里面就是‘数据库访问’组件所需 要的DLL文件等。但一般来说那些文件根本就不可能全是你写的程序都用到的。你可能只用到其 中几个。因为VB6支持很多数据访问方法,你只要用其中一种就能写出一个很好的数据库访问程 序。所以说,如果你把那个Mdac_typ.exe打入安装程序,你发布的安装程序最少也得有6M,而其 中很多是你用不到的。(主持人注:Mdac_typ.exe是针对ADO的,如果使用的是DAO或RDO,可以 不要这个文件。) 那么如果知道你到底需要哪些文件呢??我想出一个办法:在你机器上运行你写的程序,然 后用WIN98自代的那个‘系统信息’来看看你运行你的VB程序时WIN98系统装入了哪些文件库。很 简单:装入了哪些,就用哪些。 下面是具体做法: 1 在WIN98里->程序->附件->系统工具->系统信息 2 然后打开‘系统信息’后选那个树形中的‘已加载32位模块’ 现在你所看到的就是系统当前用到的DLL和一些OCX文件, 还会有一些EXE文件。VB主要可能 用的是DLL和OCX文件。运行上面两步时先不要启动你的VB程序以及其它的WIN98程序。这样我们 得到的是一个最少的文库列表,以进与后面的列表比较。 3 在右边的文件列表‘名称’里按SHIFT用鼠标选所有的文件名。然后选菜单的‘复制’并 打开记事本将 ‘复制’的信息粘过来,并保存。如:first.txt 4 打开你写的VB程序(我指的是已编译成EXE的程序)并使用它的所有功能(只是运行出来 还是不够的,DLL文件是动态装入的,只有用到相应功能时才会装入),并且不要关你的程序。 5 现在回到‘系统信息’里并按F5更新文件列表。这时所得到的列表就包括了VB所要用的 运行库。然后你要重做上面的第3步。将它也保存。如:last.txt 6 我们已经SAVE两个文件了,现在只要比较它们的不同就可以了。你可以打开那两个一边 一个很眼一行行看,看看后来存的那个多了些什么。。。也可以用 fc first.txt last.txt > diff.txt 来比。不过这样结果很乱。 总之以上方法就是根据程序运行时装入内存的文件库来确定,这个程序所必要的文件。(主 持人注:也可以从http://www.sysinternals.com/handleex.htm下载免费工具:HandleEx。这个 工具可以显示当前运行的进程都使用了哪些DLL) 制作VB安装程序问答(一) (作者:李海 2000年04月20日 13:45) 制作安装程序往往是程序设计的最后一步,同时也是重要的一步,因为运行安装程序往往是 用户的第一个操作。有不少读者询问这方面的问题,《答疑解惑》将分两期介绍一些制作Visual Basic安装程序时常遇到问题的解决方法。 问题:假如我用VB 5开发的程序很简单,只用到了 ShellExecute()这个API函数及Command Button,我能不能不做安装盘,使其在所有客户机上(Win 95/98/NT)都能正常使用?如不制作 安装程序,与EXE放在一起的应该包括哪些文件? 答:对于一个非常简单的VB 5程序,没有使用额外的OCX控件,在Win 98/2000下是可以正常 运行的(不需要制作安装盘)。因为Win 98/2000带有VB 5程序所需要的DLL文件。但在Win 95/NT 4.0下一般是不行的,因为缺少必要的文件。如果用户的机器上安装有IE 4.0/5.0,那么 应该也是可以不制作安装盘的。在一般情况下,不制作安装盘就不能保证程序的正确运行。 你制作的安装盘所包括的DLL中,除了Vb5stkit.dll只是安装时使用、安装后就不需要了, 其它DLL都是不可缺少的。虽然对于某些机器而言,由于安装过其它软件,可能不需要某个DLL, 但要想在所有的机器上都能正确运行,一个文件都不能少。所以为了避免由于缺少某个文件或注 册不正确而使程序无法运行,我建议你还是制作安装盘比较保险。 如果你的程序是放在网上供别人下载的,为了减少下载文件的大小,可以这样做:将你的程 序单独打成一个包,如果用户已经有了运行VB 5程序所需要的有关文件,就只需下载你的程序; 然后,在网页上提供一个VB 5的运行时间库的链接(如 http://download.microsoft.com/download/vb50pro/utility/1/win98/EN-US/Msvbvm50.exe) ,如果用户的机器上没有这些文件,则让他单独下载运行库。这是一种比较通行的方法。 问题:若在一个程序中使用了其它控件, 如何在没有注册该控件的机器上运行, 是不是一定 要制作安装程序或注册该控件呢? 答:在Win 95/98下,如果你的控件和EXE文件在同一个目录中,或者控件文件放置在System 目录中,EXE程序运行时会自动找到所需要的OCX文件并注册。但是这种方法在Win NT下不适用, NT下必须先注册控件才能保证EXE文件的正常运行。另外,这种自动注册有一些毛病,如果机器 已经存在一个低版本的控件,自动注册可能会失败。所以,如果你希望自己的程序能够非常好地 工作,最好还是制作安装程序,否则可能会有麻烦。 问题:请介绍一下如何利用VB 6给自己的软件加上像商业软件一样的卸载功能? 答:VB 6的安装向导制作的安装程序本身包括卸载功能,不过这个功能并不出现在“开始” 选单中。安装后,要进行卸载工作,可以打开“控制面板”,点击“安装/删除程序”图标,然 后选择想要卸载的软件。 如果希望在选单中添加卸载程序选项,可以在制作安装程序包时加入相应的程序项。VB 6的“Package & Deployment 向导”支持安装程序创建自己的程序组和选单项。在“Package & Deployment 向导”的“启动选单项”一步(图1),选择“新建项”按钮,此时会出现一个 对话框。在对话框的 “名称”文本框中输入选单项的名称,如“卸载VBTerm”。在“目标”框 中输入卸载项的命令为:$(WinPath)\st6unst.exe -n ″$(AppPath)\ST6UNST.LOG″ 。然后 选择确定关闭该对话框。这样生成的安装程序中将包括一个卸载程序的选单项。 图1 在启动选单项中添加一个卸载项 问题:本人用VB 6.0制作了一个程序,但在某个机器上安装时,会出现以下错误: 1. “system error &H80004005(02147467259)未指定错误” 2.“can not found ′c:\windows\temp\msftqws.pdw\st6unst.ext′” 3.无法开始系统安装程序。 请问原因? 答:这是由于VB 6的一个Bug导致的,你可以升级到VB 6 SP3(从 http://msdn.microsoft.com/vstudio/sp/default.asp下载),在这个升级版本中修复了这个错 误。 问题:本人用VB 6制作了一个程序,但在安装该软件时系统报告: 错误: 在′C:WINDOWS\SYSTEM\expsrv.dll′中未发现DllRegisterServer() 的 \WINDOWS\SYSTEM\expsrv.dll″输入点;在本操作期间: DllSelfRegister: ″C:;错误: 注册 文件 ′C:\WINDOWS\SYSTEM\expsrv.dll′时出错;错误: (用户响应′忽略′)。 忽略错误后安装完成。在Windows 98下安装也有同样的问题。 答:DLL有两种,一种是标准DLL,另一种是ActiveX DLL。前者拷贝到用户机器上就可以工 作了,而后者还需要调用DLL中的DllRegisterServer或者使用RegSvr32进行注册才能使用。你可 以打开VB98\Wizards\PDWizard\VB6dep.ini文件。下面是这个文件的片断: [ExpSrv.dll] Dest=$(WinSysPathSysFile) CABFileName=MSJet35.cab CABDefaultURL=http://activex.microsoft.com/controls/vb6 CABINFFile=MSJet35.inf [MSRD2x35.dll] Dest=$(WinSysPathSysFile) Register=$(DLLSelfRegister) CABFileName=MSJet35.cab CABDefaultURL=http://activex.microsoft.com/controls/vb6 CABINFFile=MSJet35.inf 可以看到MSRD2x35.dll比ExpSrv.dll多一行Register=$(DLLSelfRegister),这是因为 MSRD2x35.dll是ActiveX DLL。ExpSrv.dll是普通的DLL,没有DllRegisterServer,也用不着注 册。你所遇到的问题是VB 6的一个Bug(在VB 6 SP3中已经修复)。如果你的VB6dep.ini文件的 ExpSrv.dll多了Register一行,应该删除。或者打开安装程序的Setup.lst,删除其中 ExpSrv.dll一行中的“$(DLLSelfRegister)”字样。 问题:我在做成安装文件后,安装过程中系统缺省的目录是C:\Program Files\Tele,而我 需要的是C:\Tele2000,请问有办法修改吗? 答:要修改安装程序的缺省目录,可以打开安装盘的Setup.lst文件,在这个文件中可以找 到下面一行: DefaultDir=$(ProgramFiles)\tele 将这行中的“$(ProgramFiles)\tele”修改为你想要的目录(如C:\Tele2000)就可以了。 问题:用VB 5的安装向导制作的程序安装包里,总有一个.dep文件,请问这个文件有什么用 ?是否与OCX注册有关?如何打开?如何编辑? 答:只有当你为ActiveX控件制作安装包的时候,才会出现.dep文件。这个文件主要是供使 用你的ActiveX控件的程序设计者制作他自己程序的安装盘时使用的。你的用户在使用Setup Wizard制作安装盘时,Setup Wizard会读取这个文件,检查你的ActiveX控件需要哪些DLL支持。 一般不用手工修改这个文件,如果你认为确有必要,可以使用记事本打开修改。 问题:我用VB+Access开发数据库系统。但到发布时用VB自已的发布向导时,我程序目录中 的子目录的文件却加入不正常,向导不按子目录区分,而是将所有文件都加到程序目录中。怎么 办? 答: VB的安装向导是支持制作包括子目录的安装程序的。运行安装向导到“文件小节”一 步,在对话框中选择“添加”按钮,然后选择应该放置在子目录中的文件添加到文件列表中。 然后从文件列表中选择该文件,点击 “文件详细资料”按钮。在图3所示对话框中设置目标 路径。最好不要用绝对路径(如C:\MyProject)来指定安装位置,这样会给用户带来不便。安装 向导使用宏来指示文件要安装的位置。这些宏只在安装程序中有效。宏的含义参见表1。如果要 将文件放置在应用程序目录下的\Data子目录下,可以使用$(AppPath)\Data来指定安装路径。 问题:安装时,用VB自己的“展开与打包向导”制作的安装盘,不知道怎么让程序在桌面上 放一个快捷方式? 答:VB“展开与打包向导”所生成的安装程序的工作步骤是这样的:先运行Setup.exe,这 个程序将VB的运行库安装到用户的机器上,同时将.cab文件中的文件释放到临时目录中,然后再 调用临时目录中Setup1.exe完成余下的安装工作。Setup1.exe是由VB写的(正是这个原因所以要 先安装VB的运行库),其源程序可以在VB98\Wizards\PDWizard\Setup1中找到。如果你对VB的安 装程序不满意,希望添加新功能,可以直接修改Setup1.vbp。具体到你的问题,在VB中可以打开 Setup1.vbp,然后修改Setup1.frm的Form―Load事件,在其中可以找到如下几行: ′ ′ Create program icons (or links, i.e. shortcuts). ′ If (fMainGroupWasCreated = True) Or ((cIcons > 0) And TreatAsWin95()) Then ShowStaticMessageDialog ResolveResString(resPROGMAN) CreateIcons gsICONGROUP ′Do the same for other sections in SETUP.LST if you′ve added your own. ′CreateIcons ″MySection″ ′CreateIcons ″MyOtherSection″ End If 在If.. End If中加上: OSfCreateShellLink ″..\..\Desktop″, _ ″我的程序″, gstrDIR―DEST+″MyProg.exe″, ″ ″ 重新编译Setup1.vbp,用Setup1.exe替换掉原来的Setup1.exe即可。 问题:我用VB 5.0安装向导生成的安装程序,安装到最后时总是显示“文件 C:\Windows\System\$(DllSelfRegisterEx)不能被注册,由于它未找到”的提示信息后安装失 败,请问原因? 答:这是VB 5.0/6.0的一个Bug。 如果运行Visual Basic 5.0生成的安装盘,会产生下面的错误: The file ′<Windows System Folder>\$(DLLSelfRegisterEx)′ could not be registered because it was not found. 如果运行Visual Basic 6.0生成的安装盘,会产生下面的错误: The file ′<TEMP Folder>\Msftqws.pdw\$(DllSelfRegisterEx)′ could not be registered because it was not found. 这个问题发生在分发Microsoft Calendar control(MSCal.ocx)时。MSCal.dep文件中的 "Register="行被错误地设置成 $(DLLSelfRegisterEx)了。 解决办法如下: 1. 使用记事本打开Setup.lst文件。Setup.lst文件是Setup Wizard或PDW制作安装盘时生成 的。 2. 查找$(DLLSelfRegisterEx)。你将看到在MSCal.ocx的一行中有$(DLLSelfRegisterEx) 。 3. 修改 $(DLLSelfRegisterEx) 为$(DLLSelfRegister)。 4. 关闭记事本并保存文件。 5.运行Setup.exe。 如果希望今后生成的Setup.exe都不出这样的错误,可以这样做: 1. 使用记事本打开MSCal.dep文件。你可以在MSCal.ocx所在的目录(通常是Windows 95/98 的Windows\System或Windows NT的Winnt\System32)找到MSCal.dep文件。 2. 查找$(DLLSelfRegisterEx)。你将可以在“Register=”一行看到$ (DLLSelfRegisterEx)。 3. 修改 $(DLLSelfRegisterEx) 为$(DLLSelfRegister)。 4. 关闭记事本并保存文件。 |
B3层 发表时间: 11/09 22:50 |
![]() | 回复: cncd [cncd] ![]() |
登录 |
真是一盆热心的仙人掌:) 既解决了自己的问题又帮助了别人。 向你致敬向你学习。 |
B4层 发表时间: 11/10 00:39 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号