Встройте приложение (EXE-файл) в другой EXE-файл (mozEmbed как)

Я хотел бы встроить Mozilla Firefox в свое приложение, не используя элемента управления ActiveX (обертка TWebBrowser, Mozilla ActiveX...). Я пытался использовать TWebBrowser (на самом деле встроенный webBrowser bsalsa, который намного лучше), но все версии IE кажутся несовместимыми с некоторыми функциями популярной платформы JavaScript, и освобождает (JQuery, ExtJS...).

Мой вопрос: я могу назвать Exe Firefox из своего приложения (действительно ли это возможно с DDE или OLE), и, прежде всего, ПОКАЖИТЕ IT в моем приложении с помощью TFrame или чего-либо подобного?

ожидание предложений С уважением, M

5
задан M0-3E 28 January 2010 в 12:59
поделиться

4 ответа

Вам нужно будет немного почистить код и поработать над тем, как вы будете "разговаривать" с Firefox.
Но вот как можно встроить любое приложение в форму Delphi.

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.
5
ответ дан 14 December 2019 в 08:50
поделиться

Вы можете встроить DLL в ваше приложение и «загрузить», затем используя btmemorymodule.pas (просто Google It, и вы его найдете).

Если эта 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
ответ дан 14 December 2019 в 08:50
поделиться

Самый простой способ встроить EXE в ваше приложение - добавить его в качестве ресурса.

Сделайте файл .rc что-то вроде следующего текста:

OTHER_EXE_FILE  RCDATA "nameofother.exe"

, затем используя BRCC32.exe, вы можете компилировать файл .res с тем же именем, что и .rc, с которым вы можете включить ($ i) новый .Res файл в вашем приложении. ThameofOthout.exe должен быть в той же папке, что и файл .rc или правильно Pathed, IIRC.

Должен это еще один способ сделать это тоже. Вы не используете компилятор командной строки BRCC32.exe и просто включаете ($ i) файл .rc в вашу программу и компилятор компиляторов .rc.rc на лету.

Не могу сказать вам, работает ли второй метод или нет, так как я никогда не пробовал.

0
ответ дан 14 December 2019 в 08:50
поделиться

Я думаю, что оригинальный парень на самом деле хочет получить механизм рендеринга веб-браузера, встроенный как элемент управления в его приложение. Если это так, Gecko (часть рендеринга mozilla) доступен как плагин для вашего приложения. Я не думаю, что вы хотите запустить EXE.

Например, Mozilla Firefox - это не просто EXE-файл, он требует других вещей, включая папку profiles. Вероятно, вы не подумали обо всех проблемах, которые это вызовет.

Если вам нужен просто элемент управления веб-браузером, это не тот способ, который вам нужен. Вместо этого попробуйте следующее: http://ftp.newbielabs.com/Delphi%20Gecko%20SDK/ https://sourceforge.net/projects/d-gecko/

0
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: