编译程序时,能否在EXE中加入DLL文件?(100分)

  • 主题发起人 主题发起人 bemed
  • 开始时间 开始时间
B

bemed

Unregistered / Unconfirmed
GUEST, unregistred user!
DELPHI在[purple]编译程序时[/purple],可以将资源文件加入到EXE中,请问能不能在编译时把DLL加入到
EXE中呢?加入后,如何使用它?
 
可以,用我这个
不用释放DLL到硬盘,直接在内存加载调用

下载地址:http://u.skygz.com/mypane.aspx?down=ok&filepath=skygz%2f%b2%fa%c6%b7%2f%b4%d3%c4%da%b4%e6%bc%d3%d4%d8DLL%b2%a2%b5%f7%d3%c3_%ba%af%ca%fd%bf%e2_FOR_Delphi_v1_0_0_1.rar

示例:
{$R MyDll.Res}
Uses
MemLibLoader;

Var
DllHandle: THandle;
MsgBox: Function(lpText, LpCaption: PAnsiChar): Integer; Stdcall;
MsgBoxEx: Function(lpText, LpCaption: PAnsiChar; UType: UINT): Integer; Stdcall;

Procedure TFrmMain.Cmd_ByNameClick(Sender: TObject);
Begin
If @MsgBox <> Nil Then
MsgBox('这是按名称调用的函数', '提示');
End;

Procedure TFrmMain.CmdByIndexClick(Sender: TObject);
Begin
If @MsgBoxEx <> Nil Then
MsgBoxEx('这是按序号调用的函数', '提示', MB_ICONINFORMATION Or MB_OKCANCEL);
End;

Procedure TFrmMain.SetControls(B: Boolean);
Begin
Cmd_Load.Enabled := Not B;
Cmd_Free.Enabled := B;
End;

Procedure TFrmMain.Cmd_LoadClick(Sender: TObject);
Var
FileName: String;
Mem: TMemoryStream;
FileArray: Array Of Byte;
Begin
SetControls(true);
FileName := ExtractFilePath(ParamStr(0)) + 'MyDll.Dll';
Case CBLoadType.ItemIndex Of
0: //内存
Begin
Mem := TMemoryStream.Create;
Mem.LoadFromFile(FileName);
DllHandle := _LoadLibraryMem(Mem.Memory);
Mem.Free;
End;
1: //数组
Begin
Mem := TMemoryStream.Create;
Mem.LoadFromFile(FileName);
SetLength(FileArray, Mem.Size);
Mem.ReadBuffer(FileArray[0], Mem.Size);
DllHandle := _LoadLibraryMem(FileArray);
Mem.Free;
End;
2: DllHandle := _LoadLibraryFromResourceA(HInstance, 'MyDLL', 'DLL'); //资源
3: DllHandle := _LoadLibraryA(PChar(FileName)); //文件
End;
If DllHandle <> 0 Then
Begin
@MsgBox := _GetProcAddress(DllHandle, 'MsgBox');
@MsgBoxEx := _GetProcAddress(DllHandle, MakeIntResource($1));
End Else SetControls(false);
End;

Procedure TFrmMain.Cmd_FreeClick(Sender: TObject);
Begin
SetControls(false);
@MsgBox := Nil;
@MsgBoxEx := Nil;
_FreeLibrary(DllHandle);
End;

Procedure TFrmMain.FormCreate(Sender: TObject);
Begin
CBLoadType.ItemIndex := 0;
End;
 
可以把DLL编译成资源
然后在使用时先释放到硬盘上再动态调用
 
TO:风铃夜思雨
我希望在DELPHI编译EXE时,就把DLL加入到EXE中,你给的例子好像不行吧,我先去研究一下,分肯定少不了你的,呵呵。
 
麻烦请仔细看

{$R MyDll.Res} DLL在资源的,编译就是在EXE中

第二看函数
2: DllHandle := _LoadLibraryFromResourceA(HInstance, 'MyDLL', 'DLL'); //资源
直接加载资源中DLL
 
还是要把DLL放在资源里啊,这个方法我知道的,能不能直接把DLL编译进EXE中呢?

TO:风铃夜思雨,你的东东对我帮助挺大。
 
对呀 我也很有这种感觉 对我也有用
 
直接的话,就把DLL转换为数组喽

例如
const
mydll:array[0...大小] of byte($4d,$59..............DLL的二进制数值组成的数组结构,就像用ultraedit打开一个DLL所看到的每组数字);
 
多谢风铃夜思雨,让我视野开阔不少,真是听君一席话,胜读十年书啊,呵呵。
其实我的想法是,有两组电脑,它们编译出来的程序有不同的特殊功能(当然主要功能是一样的),
所以我想能不能把这些特殊功能放到不同的DLL中,然后在编译时自动把DLL编译进EXE中,
这样程序发布时,需要哪种特殊功能,就在哪组电脑上编译一下即可。
不过根据我几天来查询的资料,好像没有办法达到我的想法[:(]
再等两天,没人有办法就结贴!
 
多人接受答案了。
 
后退
顶部