Вставить приложение (exe-файл) в другой exe-файл (как mozEmbed) - PullRequest
5 голосов
/ 28 января 2010

Я хотел бы встроить mozilla firefox в свое приложение БЕЗ использования какого-либо элемента управления activex (обертка TWebBrowser, mozilla ActiveX ...). Я попытался использовать TWebBrowser (на самом деле встроенный в bsalsa webBrowser, который намного лучше), но все версии IE кажутся несовместимыми с некоторыми функциями популярного фреймворка и библиотек javascript (JQuery, ExtJS ...).

У меня вопрос: могу ли я вызвать exe для Firefox из моего приложения (возможно ли это с помощью DDE или OLE) и, прежде всего, ПОКАЗАТЬ ЭТО внутри моего приложения, используя TFrame или что-то подобное?

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

Ответы [ 4 ]

5 голосов
/ 01 февраля 2010

Вам нужно будет немного очистить код и понять, как вы будете «общаться» с 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

* +1007 *
1 голос
/ 28 января 2010

Вы можете встроить библиотеки 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;

Я не знаю, как встраивать исполняемые файлы.

Надеюсь, эта информация поможет.

0 голосов
/ 10 февраля 2010

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

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

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

0 голосов
/ 28 января 2010

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

Создайте файл .RC со следующим текстом:

OTHER_EXE_FILE  RCDATA "nameofother.exe"

, затем, используя brcc32.exe, вы можете скомпилировать файл .RES с тем же именем, что и .RC, с помощью которого вы можете затем включить ($ I) новый файл .RES в свое приложение. Файл NAMEOFOTHER.EXE должен находиться в той же папке, что и файл .RC, или должен быть правильно исправлен, IIRC.

Возможно, есть и другой способ сделать это. Вы не используете компилятор командной строки brcc32.exe и просто включаете ($ I) файл .RC в свою программу, а компилятор компилирует файл .RC на лету.

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

...