I would like to embed mozilla firefox into my application WITHOUT using any activex control (TWebBrowser wrapper, mozilla ActiveX...). I tried using TWebBrowser (actually bsalsa's embedded webBrowser wich is by far better), but all versions of IE seem incompatible with some features of popular javascript framework and libs (JQuery, ExtJS...).
My question is : can I call firefox's Exe from my application (is it possible with DDE or OLE) and above all SHOW IT inside my app using a TFrame or anything similar ?
waiting for your suggestions Regards, M
You'll need to clean up the code a bit and work out how you'll "talk" to Firefox.
But here is how you can embed any app inside a Delphi form.
DFM File
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 file
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.
You can embed DLLs into your application and "load" then using BTMemoryModule.pas (just google it and you find it).
If this DLL is a COM object it might work to "load" the COM DLL factory and obtaining an instance of the COM interface you want:
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;
I do not know how to embed executables.
I hope this info helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With