2010-01-28 10 views
5

Me gustaría incluir mozilla firefox en mi aplicación SIN usar ningún control activex (contenedor TWebBrowser, ActiveX de mozilla ...). Intenté usar TWebBrowser (en realidad bsalsa's embedded webBrowser que es mucho mejor), pero todas las versiones de IE parecen incompatibles con algunas características del popular javascript framework y libs (JQuery, ExtJS ...).Insertar una aplicación (archivo exe) en otro archivo exe (mozEmbed like)

Mi pregunta es: ¿puedo llamar al Exe de Firefox desde mi aplicación (es posible con DDE u OLE) y sobre todo MOSTRARLO dentro de mi aplicación usando un TFrame o algo similar?

la espera de sus sugerencias Saludos, M

+0

¿Estás hablando de incrustación OLE/COM o en realidad almacenar el archivo EXE en su aplicación? Creo que malinterpreté tu pregunta originalmente. –

+0

Posible duplicado de http://stackoverflow.com/questions/377215/webkit-support-for-delphi – skamradt

+0

Hola Ryan Exactamente !! La incrustación OLE/COM es lo que quiero hacer, pero no pude encontrar la manera de hacerlo con ff; Encontré algunas ideas interesantes (gecko SDK, mozilla activeX ...), pero no es exactamente lo que me gustaría hacer. Mi objetivo es mostrar la aplicación FF INSIDEmy, (en forma de TFrame) –

Respuesta

5

Tendrá que limpiar un poco el código y averiguar cómo va a "hablar" con Firefox.
Pero aquí es cómo puede insertar cualquier aplicación dentro de un formulario Delphi.

DFM al archivo Archivo

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. 
+0

Gracias Catharz: esto es exactamente lo que quiero hacer. Voy a intentar esto y publicar mis resultados aquí. Ahora mi pregunta es: ¿puedo publicar mensajes en FF? (abra la nueva pestaña, obtenga la última URL visitada ...) otra vez, gracias Mo3ez –

+0

No lo he mirado yo mismo, pero puede consultar el código mozdev y ver si puede usar algo de allí. Como desea utilizar JavaScript, el puente de JavaScript es probablemente exactamente lo que desea. http://delphi.mozdev.org/source.html http://downloads.mozdev.org/delphi/javascript_bridge.zip – Catharz

+0

¿No le falta un signo de igualdad? Es decir: _si AppWnd 0 then_ necesita ser _if AppWnd = 0 then_ – MaD70

1

Puede incrustar archivos DLL en su solicitud y la "carga" a continuación, utilizando BTMemoryModule.pas (sólo Google y lo encuentras).

Si este archivo DLL es un objeto COM que podría funcionar a "cargar" la fábrica COM DLL y la obtención de una instancia de la interfaz COM que desea:

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; 

No sé cómo incrustar ejecutables.

Espero que esta información ayude.

+0

Gracias Ritsaert. En realidad, estoy buscando una manera de 'controlar' Firefox (o cualquier otra aplicación) desde mi propia aplicación, algo así como DDE o COM. Mi objetivo es proporcionar las características de esa aplicación sin salir de mi propio software (por razones de seguridad y ergonomía: los usuarios solo tienen acceso a mi aplicación, no a Windows Explorer) –

+0

Por lo tanto: puede instalar Firefox en una máquina junto a su aplicación y ejecutar Firefox por ejemplo. ¿Debe estar dentro de su ventana? = –

+0

sí, tiene que estar dentro de una de las ventanas de mi aplicación. –

0

La forma más sencilla de insertar un EXE en su aplicación es agregarlo como recurso.

Haga presentar una .RC con algo como el siguiente texto:

OTHER_EXE_FILE RCDATA "nameofother.exe" 

a continuación, utilizando brcc32.exe puede compilar un archivo .RES del mismo nombre que el .RC con la que se puede incluir a continuación ($ I) el nuevo archivo .RES en su aplicación. El NAMEOFOTHER.EXE tiene que estar en la misma carpeta que el archivo .RC o estar correctamente pathed, IIRC.

Supuestamente, hay otra forma de hacer esto también. No utiliza el compilador brcc32.exe de la línea de comandos e incluye ($ I) el archivo .RC en su programa y el compilador compila el archivo .RC sobre la marcha.

No puedo decirle si el segundo método funciona o no, ya que nunca lo he probado.

+0

Gracias Ryan. ¿Hay alguna forma de mostrar el archivo ejecutable en un cuadro en el formulario principal de mi aplicación? (como Adobe Acrobat Reader). –

+0

Debería guardar el recurso en el disco, luego ejecutarlo y manejarlo como corresponda. En teoría, no se puede iniciar, y en la memoria .exe tiene que estar en el disco. Hay formas de hacerlo, pero creo que cada vez es más difícil hacerlo debido a la amenaza de troyanos y virus que hacen el mismo tipo de cosas. La otra cosa es si estás tratando de hacer COM Creo que el .EXE almacenado tiene que estar registrado con el subsistema COM para ser utilizado correctamente. No puedo ver que eso ocurra si intentas ejecutarlo desde tu aplicación, a menos que lo registres/desinscribas sobre la marcha. –

0

Creo que lo que el tipo original, quiere en realidad es un navegador Web motor incorporado como un control en su aplicación de renderización. Si es así, Gecko (la parte de representación de mozilla) está disponible como un complemento para su Aplicación. No creo que quieras ejecutar un EXE.

Por ejemplo, Mozilla Firefox no es solo un archivo EXE, sino que requiere otras cosas, incluida una carpeta de perfiles. Probablemente no has pensado en todos los problemas que causarían.

Si solo desea un control de navegador web, esta no es la forma de hacerlo.Prueba este lugar: http://ftp.newbielabs.com/Delphi%20Gecko%20SDK/ https://sourceforge.net/projects/d-gecko/

+0

Gracias warren: pero como dije en mi primera publicación, no quiero incorporar un componente webbroswer dentro de mi aplicación (ya sea que sea TWebBrowser IE wrapper, Mozilla ActiveX o gecko SDK) pero mostrar una aplicación externa en una de mis ventanas (FF en este caso). Es útil saberlo de todos modos: lo intenté Gecko SDK delphi wrapper y lo encontré muy útil. Gracias por la sugerencia –

Cuestiones relacionadas