Я хотел бы встроить Mozilla Firefox в свое приложение, не используя элемента управления ActiveX (обертка TWebBrowser, Mozilla ActiveX...). Я пытался использовать TWebBrowser (на самом деле встроенный webBrowser bsalsa, который намного лучше), но все версии IE кажутся несовместимыми с некоторыми функциями популярной платформы JavaScript, и освобождает (JQuery, ExtJS...).
Мой вопрос: я могу назвать Exe Firefox из своего приложения (действительно ли это возможно с DDE или OLE), и, прежде всего, ПОКАЖИТЕ IT в моем приложении с помощью TFrame или чего-либо подобного?
ожидание предложений С уважением, M
Вам нужно будет немного почистить код и поработать над тем, как вы будете "разговаривать" с 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.
Вы можете встроить 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;
Я не знаю, как встраивать исполняемые файлы.
Я надеюсь, что эта информация помогает.
Самый простой способ встроить 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 на лету.
Не могу сказать вам, работает ли второй метод или нет, так как я никогда не пробовал.
Я думаю, что оригинальный парень на самом деле хочет получить механизм рендеринга веб-браузера, встроенный как элемент управления в его приложение. Если это так, Gecko (часть рендеринга mozilla) доступен как плагин для вашего приложения. Я не думаю, что вы хотите запустить EXE.
Например, Mozilla Firefox - это не просто EXE-файл, он требует других вещей, включая папку profiles. Вероятно, вы не подумали обо всех проблемах, которые это вызовет.
Если вам нужен просто элемент управления веб-браузером, это не тот способ, который вам нужен. Вместо этого попробуйте следующее: http://ftp.newbielabs.com/Delphi%20Gecko%20SDK/ https://sourceforge.net/projects/d-gecko/