Delphi 将一个应用程序(exe文件)嵌入另一个exe文件(类似mozEmbed)
我想将mozilla firefox嵌入到我的应用程序中,而不使用任何activex控件(TWebBrowser包装,mozilla activex…)。我尝试使用TWebBrowser(实际上bsalsa的嵌入式webBrowser wich要好得多),但IE的所有版本似乎都与流行的javascript框架和libs(JQuery、ExtJS…)的某些功能不兼容 我的问题是:我可以从我的应用程序中调用firefox的Exe吗(可以使用DDE或OLE),最重要的是在我的应用程序中使用TFrame或类似的东西显示它吗 等待你的建议Delphi 将一个应用程序(exe文件)嵌入另一个exe文件(类似mozEmbed),delphi,firefox,embed,dde,Delphi,Firefox,Embed,Dde,我想将mozilla firefox嵌入到我的应用程序中,而不使用任何activex控件(TWebBrowser包装,mozilla activex…)。我尝试使用TWebBrowser(实际上bsalsa的嵌入式webBrowser wich要好得多),但IE的所有版本似乎都与流行的javascript框架和libs(JQuery、ExtJS…)的某些功能不兼容 我的问题是:我可以从我的应用程序中调用firefox的Exe吗(可以使用DDE或OLE),最重要的是在我的应用程序中使用TFrame
关于,M您可以将DLL嵌入到应用程序中并“加载”,然后使用BTMemoryModule.pas(只需在谷歌上搜索即可找到它) 如果此DLL是COM对象,则可能用于“加载”COM DLL工厂并获取所需COM接口的实例:
var
// Our own method of COM / OLE object loading!
Lib: HMODULE;
Ptr: TDllGetClassObject;
Unl: TDLLCanUnloadNow;
I: IClassFactory;
initialization
Lib := LoadLibrary( 'zkemkeeper.dll' );
Ptr := GetProcAddress( Lib, 'DllGetClassObject' );
Unl := GetProcAddress( Lib, 'DllCanUnloadNow' );
if Assigned( Ptr ) and ( Ptr( CLASS_CZKEM, IClassFactory, I ) <> S_OK ) then I := nil;
finalization
I := nil;
OleInitialize( nil );
// Create a IZKEM interface instance
if not Assigned( I ) then Exit;
if I.CreateInstance( nil, IZKEM, CZ ) <> S_OK then Exit;
if not Assigned( CZ ) then Exit;
var
//我们自己的COM/OLE对象加载方法!
Lib:HMODULE;
Ptr:TDllGetClassObject;
Unl:TDLLCanUnloadNow;
I:IClassFactory;
初始化
Lib:=LoadLibrary('zkemceeper.dll');
Ptr:=GetProcAddress(Lib,'DllGetClassObject');
Unl:=GetProcAddress(Lib,'DllCanUnloadNow');
如果分配(Ptr)和(Ptr(类CZKEM,IClassFactory,I)S_OK),则I:=nil;
定稿
I:=零;
(零);
//创建IZKEM接口实例
如果未分配(I),则退出;
如果I.CreateInstance(nil,IZKEM,CZ)S_OK,则退出;
如果未分配(CZ),则退出;
我不知道如何嵌入可执行文件
我希望这些信息能有所帮助。将EXE嵌入应用程序的最简单方法是将其作为资源添加 创建一个包含以下文本的.RC文件:
OTHER_EXE_FILE RCDATA "nameofother.exe"
然后使用brcc32.exe,您可以编译一个与.RC同名的.RES文件,然后在应用程序中包含($I)新的.RES文件。NAMEOFOTHER.EXE必须与.RC文件位于同一文件夹中,或者必须具有正确的路径IIRC
据说还有另一种方法可以做到这一点。
您不使用命令行brcc32.exe编译器,只需在程序中包含($I)该.RC文件,编译器会动态编译该.RC文件
无法告诉您第二种方法是否有效,因为我从未尝试过。您需要稍微清理一下代码,并确定如何与Firefox“对话”。
但以下是如何将任何应用程序嵌入Delphi表单中 DFM文件
object frmMain: TfrmMain
Left = 195
Top = 154
Width = 527
Height = 363
Caption = 'Containership Test'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
DesignSize = (
519
329)
PixelsPerInch = 96
TextHeight = 13
object pnlTop: TPanel
Left = 0
Top = 0
Width = 519
Height = 292
Align = alTop
Anchors = [akLeft, akTop, akRight, akBottom]
BevelInner = bvLowered
TabOrder = 0
end
object btnLoadApp: TButton
Left = 172
Top = 297
Width = 75
Height = 25
Anchors = [akLeft, akBottom]
Caption = 'Load'
TabOrder = 1
OnClick = btnLoadAppClick
end
object btnKill: TButton
Left = 260
Top = 297
Width = 75
Height = 25
Anchors = [akLeft, akBottom]
Caption = 'Kill'
TabOrder = 2
OnClick = btnKillClick
end
end
main.pas文件
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ShellApi;
type
TfrmMain = class(TForm)
pnlTop: TPanel;
btnLoadApp: TButton;
btnKill: TButton;
procedure btnLoadAppClick(Sender: TObject);
procedure btnKillClick(Sender: TObject);
private
{ Private declarations }
AppWnd : DWORD;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btnLoadAppClick(Sender: TObject);
var
ExecuteFile : string;
SEInfo: TShellExecuteInfo;
begin
ExecuteFile:='c:\Windows\notepad.exe';
FillChar(SEInfo, SizeOf(SEInfo), 0) ;
SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
with SEInfo do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := pnlTop.Handle;
lpFile := PChar(ExecuteFile) ;
nShow := SW_HIDE;
end;
if ShellExecuteEx(@SEInfo) then
begin
AppWnd := FindWindow(nil, PChar('Untitled - Notepad'));
if AppWnd <> 0 then
begin
Windows.SetParent(AppWnd, SEInfo.Wnd);
ShowWindow(AppWnd, SW_SHOWMAXIMIZED);
ShowWindow(AppWnd, SW_SHOWMAXIMIZED);
end;
end
else
ShowMessage('Error starting notepad!') ;
end;
procedure TfrmMain.btnKillClick(Sender: TObject);
begin
if (AppWnd <> 0) then
begin
PostMessage(AppWnd, WM_Close, 0, 0);
AppWnd := 0;
end;
end;
end.
unitmain;
接口
使用
窗口、消息、系统工具、变体、类、图形、控件、窗体、,
对话框、StdCtrls、ExtCtrls、ShellApi;
类型
TfrmMain=类(TForm)
pnlTop:TPanel;
btnLoadApp:TButton;
btnKill:t按钮;
程序btnLoadAppClick(发送方:TObject);
程序btnKillClick(发送方:TObject);
私有的
{私有声明}
附件:德沃德;
公众的
{公开声明}
结束;
变量
frmMain:TfrmMain;
实施
{$R*.dfm}
过程TfrmMain.btnLoadAppClick(发送方:TObject);
变量
可执行文件:字符串;
SEInfo:TShellExecuteInfo;
开始
ExecuteFile:=“c:\Windows\notepad.exe”;
FillChar(SEInfo,SizeOf(SEInfo),0);
SEInfo.cbSize:=SizeOf(TShellExecuteInfo);
用SEInfo做
开始
fMask:=见屏蔽过程;
Wnd:=pnlTop.Handle;
lpFile:=PChar(可执行文件);
nShow:=SW_HIDE;
结束;
如果ShellExecuteEx(@SEInfo)那么
开始
AppWnd:=FindWindow(无,PChar('Untitled-Notepad'));
如果应用0,则
开始
SetParent(AppWnd,SEInfo.Wnd);
显示窗口(AppWnd,SW_显示最大化);
显示窗口(AppWnd,SW_显示最大化);
结束;
结束
其他的
ShowMessage('启动记事本时出错!');
结束;
过程TfrmMain.btnKillClick(发送方:TObject);
开始
如果(AppWnd 0),则
开始
PostMessage(AppWnd,WM_Close,0,0);
AppWnd:=0;
结束;
结束;
结束。
我认为最初的家伙真正想要的是一个Web浏览器渲染引擎,作为控件嵌入到他的应用程序中。如果是这样,Gecko(mozilla渲染部分)可以作为应用程序的插件提供。我认为你不想运行EXE
例如,Mozilla Firefox不仅仅是一个EXE文件,还需要其他东西,包括一个profiles文件夹。你可能还没有考虑到所有可能导致的问题
如果您只是想要一个web浏览器控件,那么这不是实现它的方法。请尝试以下方法:
谢谢你,里萨尔特。事实上,我正在寻找一种从我自己的应用程序“监控”firefox(或任何其他应用程序)的方法,比如DDE或COM。我的目标是在不退出我自己的软件的情况下提供该应用程序的功能(出于安全和功能原因:用户只能访问我的应用程序,没有windows资源管理器),因此:您可以在应用程序旁边的机器上安装Firefox,并运行Firefox。它必须在你的一扇窗户内=谢谢你,瑞安。有没有办法在我的应用程序的主窗体内的tframe中显示存储的exe?(如Adobe acrobat Reader)。您需要将资源保存到磁盘,然后启动它并相应地处理它。从理论上讲,无论如何,你不能在内存中启动.exe,它必须在磁盘上。有很多方法可以做到这一点,但我相信这正变得越来越难,因为特洛伊木马和病毒的威胁在做同样的事情。另一件事是,如果您试图使用COM,我相信存储的.EXE必须在COM子系统中注册才能正确使用。如果您尝试在应用程序中运行它,我看不到会发生这种情况,除非您动态注册/取消注册它。您是在谈论OLE/COM嵌入还是在应用程序中实际存储EXE?我想我最初误解了你的问题。可能是Hi Ryan的复制品!!OLE/COM嵌入是我想要做的:但我找不到一种使用ff的方法;我发现了一些有趣的想法(gecko SDK、mozilla activeX…),但这并不是我想要做的。我的去