请问怎样将一个exe加载到dll中,然后再读出来 找免费销售管理软件
财务软件版1楼: 或者怎样加载到资源动态库中,再读取出来
Hdll := loadlibrary(Pchar(DllFileName));
Loadstring(hdll, 1, MyChar, 254);//读字符串
对应的读exe的函数(类似Loadstring)是什么呢?
-------------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.
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楼: 哈。我的方法可真夠笨的。
沒看道蛋炒飯的代碼之前我也是那樣做的,可惜出錯了。
學習。