论坛: 编程破解 标题: 一个VB的问题 复制本贴地址    
作者: 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号