Вопрос по delphi, dde, embed, firefox – Вставить приложение (exe-файл) в другой exe-файл (как mozEmbed)

5

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

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

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

Возможный дубликатstackoverflow.com/questions/377215/webkit-support-for-delphi skamradt
Привет Райан Точно !! Я хочу сделать встраивание OLE / COM: но я не смог найти способ сделать это с помощью ff; Я нашел некоторые интересные идеи (Gecko SDK, Mozilla ActiveX ...), но это не совсем то, что я хотел бы сделать. Моя цель - показать приложение FF INSIDEmy (способом TFrame). M0-3E
Вы говорите о встраивании OLE / COM или сохранении EXE в вашем приложении? Я думаю, что я неправильно понял ваш вопрос изначально. Ryan J. Mills

Ваш Ответ

4   ответа
0

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

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

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

Спасибо, Уоррен: но, как я уже говорил в своем первом посте, я не хочу вставлять компонент webbroswer в мое приложение (если это оболочка TWebBrowser IE, Mozilla ActiveX или gecko SDK), но показывать внешнее приложение в одном из моих окон ( ФФ в этом случае). В любом случае это полезно знать: я попробовал обертку Delphi Gecko SDK и нашел ее довольно полезной. Спасибо за чаевые M0-3E
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.
Я не смотрел на это сам, но вы можете проверить код mozdev и посмотреть, сможете ли вы использовать что-то оттуда. Поскольку вы хотите использовать JavaScript, мост JavaScript, вероятно, именно то, что вы хотите.delphi.mozdev.org/source.html downloads.mozdev.org/delphi/javascript_bridge.zip Catharz
Во всяком случае, это интересно. Можете ли вы прямо изложить технику в своем ответе? Это, по сути, для преобразования целевого исполняемого окна верхнего уровня в дочернее окно собственного приложения. MaD70
Спасибо, Катарз: это именно то, что я хочу сделать. Я попробую это и опубликую свои результаты здесь. Теперь мой вопрос: могу ли я публиковать сообщения в FF? (откройте новую вкладку, получите последний посещенный URL ..) еще раз, спасибо Mo3ez M0-3E
Не пропускает знак равенства? т.е .:если AppWnd 0 тогда должно бытьесли AppWnd = 0, то MaD70
MaD70, нет, оператор if должен быть "if AppWnd не равен 0". Похоже, синтаксический анализатор убрал знаки «меньше» и «больше, чем», когда я вставил код. Техника похожа на то, что делает приложение, над которым я работаю. Но он встраивает формы в страницы элемента управления вкладками. В приведенном выше примере я выполняю приложение в скрытом состоянии. Затем я могу установить в качестве родительского элемента любой элемент управления Windows (в данном случае панель), прежде чем скрывать его. Это встраивает приложение в этот элемент управления. По какой-то причине ShowWindow нужно вызвать дважды, чтобы это работало. Catharz
0

ачестве ресурса.

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

OTHER_EXE_FILE  RCDATA "nameofother.exe"

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

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

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

Спасибо, Райан. Есть ли способ показать сохраненный exe в tframe внутри основной формы моего приложения? (например, Adobe Acrobat Reader). M0-3E
Вам нужно будет сохранить ресурс на диске, затем запустить его и обработать соответствующим образом. В любом случае, теоретически вы не можете запустить и в памяти .exe он должен быть на диске. Есть способы сделать это, но я считаю, что это становится все труднее и труднее из-за угрозы троянов и вирусов, делающих то же самое. Другое дело, если вы пытаетесь сделать COM, я считаю, что сохраненный .EXE должен быть зарегистрирован в подсистеме COM для правильного использования. Я не вижу такого, если вы попытаетесь запустить его из своего приложения, если вы не зарегистрируете / отмените регистрацию на лету. Ryan J. Mills
1

а затем использовать BTMemoryModule.pas (просто гуглите, и вы найдете его).

Если эта 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;

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

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

Таким образом: вы можете установить Firefox на машине рядом с вашим приложением и запустить Firefox, например. Это должно быть внутри вашего одного из ваших окон = Ritsaert Hornstra
да, это должно быть в одном из окон моего приложения. M0-3E
Спасибо, Рицерт. На самом деле, я ищу способ «контролировать» Firefox (или любое другое приложение) из моего собственного приложения, например, DDE или COM. Моя цель - предоставить возможности этого приложения, не выходя из собственного программного обеспечения (по соображениям безопасности и эргономики: пользователи имеют доступ только к моему приложению, без проводника Windows) M0-3E

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