delphifirefoxembeddde

Embed an application (exe file) into another exe file (mozEmbed like)


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


Solution

  • 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.