当前位置:主页>销售管理软件> 列表

请问怎样将一个exe加载到dll中,然后再读出来 找免费销售管理软件

财务软件版1楼: 或者怎样加载到资源动态库中,再读取出来
Hdll := loadlibrary(Pchar(DllFileName));
Loadstring(hdll, 1, MyChar, 254);//读字符串
对应的读exe的函数(类似Loadstring)是什么呢?

2楼: createprocess 如免费销售管理软件

3楼: to kgm
并不是想运行 而是加载后 copy出来

4楼: 你要把一个exe文件写到dll中,然后再读出来?有这个必要吗?

5楼: exe是形成了res文件 ,编译为dll后 ,怎样从dll中解出来呢?

6楼: Res: TResourceStream;

h:= LoadLibrary(''MakeLicence.dll'');
if h = 0 then
raise Exception.Create(''找不到动态库MakeLicence.dll'');

// 根据创建res文件时指定的标记读出exe文件的内容
Res := TResourceStream.Create(h, ''res'', PChar(''res''));
try
// 把资源文件中得到的内容保存为exe文件
Res.SaveToFile(sPath + ''test.exe'');
finally
Res.Free;
FreeLibrary(h);
end;

其中

财务软件版7楼: Resource.rc中內容如下
TESTEXE EXEFILE notepad.exe


-------------DLL文件--------------

library ExeDll;

uses
SysUtils,
Classes;

{$R *.res}
{$R Resource.res}
function GetExe(aExeName:pChar;var ms:TMemoryStream):Boolean;stdcall;
var
rs:TResourceStream;
begin
Try
rs:=TResourceStream.Create(HInstance,aExeName,''EXEFILE'');
try
ms.CopyFrom(rs,rs.Size);
finally
rs.Free;
rs:=nil;
end;
Result:=True;
except
Result:=False;
end;
end;

exports
GetExe;
begin
end.
----------------調用Dll之程式----------------------------
unit u_GetExeFromDll;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellAPI;

type
TF_GetExeFromDll = class(TForm)
btnGetExeFromDll: TButton;
procedure btnGetExeFromDllClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
F_GetExeFromDll: TF_GetExeFromDll;

implementation

{$R *.dfm}

procedure TF_GetExeFromDll.btnGetExeFromDllClick(Sender: TObject);
type
//此Function之Type與Dll中程式類型一樣
TGetExeFunc = function(aExeName: pChar; var ms: TMemoryStream): Boolean; stdcall;
var
hExe: THandle;
hFunc: TFarProc;
GetExeFunc: TGetExeFunc;
ms: TMemoryStream;
sd: TSaveDialog;
begin
hExe := LoadLibrary(''ExeDll.dll'');
try
if hExe <> 0 then
begin
hFunc := GetProcAddress(hExe, pChar(''GetExe'')); //Dll中的程式名稱
if hFunc <> nil then
begin
GetExeFunc := TGetExeFunc(hFunc);
ms := TMemoryStream.Create;
tf(''TESTEXE'', ms); //EXEFile所對應資源名稱
GetExeFunc := TSaveDialog.Create(nil);
with sd do
try
if Execute then
ms.SaveToFile(FileName);
finally
sd.free;
end;
ms.Free;
end;
end;
finally
FreeLibrary(hExe);
end;
end;

end.

8楼: 有一段寫錯了,更正如下:
GetExeFunc(''TESTEXE'', ms);
sd := TSaveDialog.Create(nil);
with sd do
try
sd.Filter:=''executable programe(*.exe)|*.exe'';

9楼: to 蛋炒饭 thanks
初步测试通过

10楼: 哈。我的方法可真夠笨的。
沒看道蛋炒飯的代碼之前我也是那樣做的,可惜出錯了。
學習。