如何使用DLL文件来减小EXE文件的大小?(200分)

  • 主题发起人 主题发起人 向无极
  • 开始时间 开始时间

向无极

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,大家好!
用DELPHI或其他编程语言编制的EXE文件通常不会太小,不知如何使用我们自己编写
的DLL文件来实现EXE文件的精简?比如像MICROSOFT的OUTLOOK邮件软件的可执行文件大小
只有48K字节,其他的一些软件如NETANTS也都有使用自己的DLL文件。
还有,如何编制使本EXE文件大小精简的DLL?
望高手不啬赐教,最好有相关资料可以发至本人的邮箱。WJBOY@NETEASE.COM
 
把一些弹出窗体都可以做到dll中去。
 
只要使用VCL体系,exe文件就小不了,及时改为dll,其dll体积也很大。
最简单的办法是连通vcl50.bpl一起发布,exe文件就可以做得较小。当然,
必须平衡考虑,因为vcl50.bpl本身也不小,只有在exe大到一定程度,用
vcl50.bpl才核算,否则,让它去吧!
 
DLL的功能不只是使EXE变小点,还可以减少内存消耗,将多个程序要共用到的窗体、函数
加到DLL中。找本书看最好,书上应该讲得很清楚。
 
压缩最好
 
那个UPX或ASPack压缩一下,文件大约减少2/3
 
据说用ASPack压缩后的程序运行后会出现内存漏洞。
EXE程序可以只有一个主界面,然后所有的功能都通过调用DLL来实现,如果你连主菜单
都通过DLL来控制的话,那你以后增加功能的话都不需要改主程序了。
 
还是ASPack比较实用
 
如果只为写小执行程序,告诉你一个例子自己回去慢慢看(email)
这个例子程序员大本营里有
 
多谢各位的观点,我的目的是想利用DLL文件这一先进的编程技术。
以压缩来减小文件大小绝非本人所愿.
各位还有什么高见敬请发表,我等待好消息。谢谢!
 
程序中的一切都可以放在dll中,但是exe+dll并不一定会减小
如果想学作dll,我可以帮你找一些例子
 
小黄鱼,
给我一些 exe + dll 的例子
 
1创建Dll
下面是建立动态链接库的具体步骤:
(1)启动Delphi。
(2)在IDE选择File|New命令,在New Items对话框选择DLL,
Delphi将为你创建一个DLL程序的外壳。
(3)添加要实现的过程或函数。
示例:
library lx1;
uses
SysUtils,
Classes;
function lx(i,j:Integer):Integer;stdcall;
begin
Result:=i+j;
end;
exports lx;
end.

2静态调用。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function lx(i,j:Integer):Integer;stdcall;
External 'lx1.dll' Name 'lx';
//上面一行是静态调用时声明方法。
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption:=inttostr(lx(1,2));
end;

end.

3动态调用
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
type
TMyfunc=function (i,j:Integer):Integer;stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
Myfunc : TMyFunc;
MyHandle: THandle;
begin
MyHandle:=LoadLibRaRy('lx1.dll');
if MyHandle<=0 then
begin
Raise Exception.Create('动态连接库lx1.dll加载失败,其原因(错误代码)是:'+IntToStr(GetLastError));
end else
begin
@MyFunc:=GetProcAddress(MyHandle,'lx');
if not Assigned(MyFunc) then
begin
Raise Exception.Create('动态连接库lx1.dll的lx函数调用失败,其原因(错误代码)是:'+IntToStr(GetLastError));
end else
begin
Button1.Caption:=inttostr(MyFunc(1,2));
end;
end;
FreeLibrary(MyHandle);
end;

end.

 
把资源放在DLL 中特别是图片.
把可要可不要的功能放在DLL中,做成插件一样的形式.
把EXE 和DLL 都压缩,用 Aspack 可以的,我做的东西可以压缩到原体积的44%左右.
具体怎么写DLL 我觉得很多地方都有例子.
 
用DLL本身不会减小程序文件的大小(很多情况下反而会增加),
除非是多个程序共用一个DLL,比如vcl50.bpl
Aspack我一直在用,感觉很好,没发现有啥内存泄漏啊
 
outlook小是因为它的许多包没有编译进exe中,在delphi中也可以用这种编译模式,比如
一个只有一个form的程序只要14K,知识发布是要带包!
 
非常感谢大家的高见!
 
后退
顶部