我想将mozilla firefox嵌入到我的应用程序中而不使用任何activex控件(TWebBrowser包装器,mozilla ActiveX ...)。我尝试使用TWebBrowser(实际上bsalsa的嵌入式webBrowser更好),但所有版本的IE似乎都与流行的javascript框架和libs(JQuery,ExtJS ......)的某些功能不兼容。
我的问题是:我可以从我的应用程序调用firefox的Exe(可能使用DDE或OLE),最重要的是在我的应用程序中使用TFrame或类似的东西显示它吗?
等待你的建议 问候,M答案 0 :(得分:5)
您需要稍微清理代码并弄清楚如何与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.
答案 1 :(得分:1)
您可以将DLL嵌入到您的应用程序中,然后使用BTMemoryModule.pas“加载”(只需google它就可以找到它)。
如果此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;
我不知道如何嵌入可执行文件。
我希望这些信息有所帮助。
答案 2 :(得分:0)
将EXE嵌入应用程序的最简单方法是将其作为资源添加。
使用以下文字制作.RC文件:
OTHER_EXE_FILE RCDATA "nameofother.exe"
然后使用brcc32.exe,您可以编译与.RC同名的.RES文件,然后您可以在应用程序中包含($ I)新的.RES文件。 NAMEOFOTHER.EXE必须与.RC文件位于同一文件夹中,或者正确地进行修改,IIRC。
还有另一种方法可以做到这一点。 你不要使用命令行brcc32.exe编译器,只需在程序中包含($ I).RC文件,编译器即可编译.RC文件。
无法告诉你第二种方法是否有效,因为我从未尝试过。
答案 3 :(得分:0)
我认为原始人真正想要的是在他的应用程序中嵌入作为控件的Web浏览器渲染引擎。如果是这样,Gecko(Mozilla渲染部分)可作为应用程序的插件。我认为你不想运行EXE。
例如,Mozilla Firefox不仅仅是一个EXE文件,还需要其他东西,包括个人资料文件夹。你可能没有想过会造成的所有问题。
如果您只想要一个Web浏览器控件,这不是这样做的方法。试试这个: http://ftp.newbielabs.com/Delphi%20Gecko%20SDK/ https://sourceforge.net/projects/d-gecko/