2010-01-28 6 views
5

Je voudrais intégrer mozilla firefox dans mon application SANS utiliser de contrôle ActiveX (wrapper TWebBrowser, mozilla ActiveX ...). J'ai essayé d'utiliser TWebBrowser (en fait le webBrowser intégré de bsalsa qui est de loin meilleur), mais toutes les versions de IE semblent incompatibles avec certaines fonctionnalités du framework javascript populaire et libs (JQuery, ExtJS ...). Ma question est: est-ce que je peux appeler Exe de Firefox à partir de mon application (est-ce possible avec DDE ou OLE) et surtout SHOW IT dans mon application en utilisant un TFrame ou quelque chose de similaire?Intégrer une application (fichier exe) dans un autre fichier exe (comme mozEmbed)

attendant vos suggestions Cordialement, M

+0

Voulez-vous parler de l'intégration d'OLE/COM ou de stocker effectivement le fichier EXE dans votre application? Je pense que j'ai mal compris votre question à l'origine. –

+0

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

+0

Salut Ryan Exactement !! L'intégration OLE/COM est ce que je veux faire: mais je ne pouvais pas trouver un moyen de le faire avec ff; J'ai trouvé quelques idées intéressantes (gecko SDK, mozilla activeX ...), mais ce n'est pas tout à fait ce que je voudrais faire. Mon but est de montrer l'application FF INSIDEmy, (de manière TFrame.) –

Répondre

5

Vous aurez besoin de nettoyer un peu le code et de déterminer comment vous allez "parler" à Firefox.
Mais voici comment vous pouvez intégrer une application dans un formulaire Delphi.

DFM Fichier

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 

fichier 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

Merci Catharz: c'est exactement ce que je veux faire. Je vais essayer ça et poster mes résultats ici. Maintenant, ma question est: puis-je poster des messages à FF? (ouvrir nouvel onglet, obtenir la dernière URL visitée ..) encore, merci Mo3ez –

+0

Je ne l'ai pas regardé moi-même, mais vous pouvez vérifier le code de mozdev et voir si vous pouvez utiliser quelque chose de là. Puisque vous voulez utiliser JavaScript, le pont JavaScript est probablement exactement ce que vous voulez. http://delphi.mozdev.org/source.html http://downloads.mozdev.org/delphi/javascript_bridge.zip – Catharz

+0

Un signe égal ne manque-t-il pas? I.e .: _if AppWnd 0 then_ doit être _if AppWnd = 0 then_ – MaD70

1

Vous pouvez intégrer des DLL dans votre application et « charge » puis en utilisant BTMemoryModule.pas (juste google et vous trouvez).

Si cette DLL est un objet COM, il pourrait fonctionner à « charger » l'usine de DLL COM et obtenir une instance de l'interface COM que vous voulez:

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; 

Je ne sais pas comment intégrer executables.

J'espère que cette information est utile.

+0

Merci Ritsaert. En fait, je cherche un moyen de 'surveiller' Firefox (ou toute autre application) de ma propre application, quelque chose comme DDE ou COM. Mon but est de fournir les fonctionnalités de cette application sans quitter mon propre logiciel (pour des raisons de sécurité et d'ergonomie: les utilisateurs n'ont accès qu'à mon application, sans Windows Explorer) –

+0

Ainsi: vous pouvez installer Firefox sur une machine à côté de votre applcation et lancez Firefox par exemple. Doit-il être à l'intérieur de l'une de vos fenêtres = –

+0

oui, il doit être dans l'une de mes fenêtres d'application. –

0

La manière la plus simple d'incorporer un fichier EXE dans votre application consiste à l'ajouter en tant que ressource.

Faire un fichier .rc avec quelque chose comme le texte suivant:

OTHER_EXE_FILE RCDATA "nameofother.exe" 

puis en utilisant BRCC32.EXE vous pouvez compiler un fichier .RES du même nom que le .rc avec lequel vous pouvez ensuite inclure ($ I) le nouveau fichier .RES dans votre application. Le NAMEOFOTHER.EXE doit être dans le même dossier que le fichier .RC ou être correctement pathed, IIRC.

On suppose qu'il existe une autre façon de procéder. Vous n'utilisez pas le compilateur brcc32.exe en ligne de commande et vous n'avez qu'à inclure ($ I) le fichier .RC dans votre programme et le compilateur compile le fichier .RC à la volée.

Je ne peux pas vous dire si la seconde méthode fonctionne ou non car je ne l'ai jamais essayé.

+0

Merci Ryan. Existe-t-il un moyen de montrer l'exe stocké dans un tframe dans le formulaire principal de mon application? (comme Adobe Acrobat Reader). –

+0

Vous devez enregistrer la ressource sur le disque, puis la lancer et la gérer en conséquence. Vous ne pouvez pas, en théorie de toute façon, lancer et en mémoire .exe il doit être sur disque. Il y a des façons de le faire, mais je crois que c'est de plus en plus difficile à faire à cause de la menace des chevaux de Troie et des virus qui font le même genre de choses. L'autre chose est si vous essayez de faire COM, je crois que le .EXE stocké doit être enregistré avec le sous-système COM pour être utilisé correctement. Je ne peux pas voir cela se produire si vous essayez de l'exécuter à partir de votre application, sauf si vous l'enregistrez/désinscrivez à la volée. –

0

Je pense que le gars d'origine veut réellement est un moteur de rendu navigateur Web intégré comme un contrôle dans son application. Si c'est le cas, Gecko (la partie de rendu Mozilla) est disponible en tant que plugin pour votre application. Je ne pense pas que vous voulez exécuter un EXE. Par exemple, Mozilla Firefox n'est pas simplement un fichier EXE, mais nécessite d'autres éléments, y compris un dossier de profils. Vous n'avez probablement pas pensé à tous les problèmes qui pourraient causer.

Si vous voulez juste un contrôle de navigateur Web, ce n'est pas la façon de le faire.Essayez ceci: http://ftp.newbielabs.com/Delphi%20Gecko%20SDK/ https://sourceforge.net/projects/d-gecko/

+0

Merci warren: mais comme je l'ai dit dans mon premier post, je ne veux pas incorporer un composant webbroswer dans mon application (qu'il s'agisse de wrapper IE TWebBrowser, Mozilla ActiveX ou gecko SDK) mais afficher une application externe dans une de mes fenêtres (FF dans ce cas). Il est utile de savoir quand même: j'ai essayé Gecko SDK delphi wrapper et je l'ai trouvé très utile. Merci pour le pourboire –

Questions connexes