J'aimerais intégrer Mozilla Firefox dans mon application sans utiliser de contrôle ActiveX (TwebBrowser Wrapper, Mozilla ActiveX ...). J'ai essayé d'utiliser Twebbrowser (en réalité, WELBrowser WebBrowsed WEBLOWED WICH est de loin mieux), mais toutes les versions d'IE semblent incompatibles avec certaines caractéristiques de Cadre JavaScript populaire et de Libs (JQuery, ExtJs ...). P>
Ma question est la suivante: Puis-je appeler EXE de Firefox de ma candidature (est-il possible avec DDE ou OLE) et surtout montrez-le à l'intérieur de mon application à l'aide d'un Tframe ou de quelque chose de similaire? P>
En attente de vos suggestions Cordialement, M P>
4 Réponses :
Vous pouvez intégrer des dlls dans votre application et "charger" puis à l'aide de btmemorymodule.pas (juste Google it et vous le trouvez).
Si cette DLL est un objet COM, cela pourrait fonctionner pour "charger" l'usine COM dll et obtenir une instance de l'interface COM que vous souhaitez: P>
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;
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 objectif 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 ont accès uniquement à mon application, sans Explorateur Windows)
Ceci: Vous pouvez installer Firefox sur une machine à côté de votre application et exécuter Firefox par exemple. Doit-il être à l'intérieur de votre une de vos fenêtres =
Le moyen le plus simple d'intégrer un exe dans votre application consiste à l'ajouter en tant que ressource.
Fabriquez un fichier .rc avec quelque chose comme le texte suivant: p>
OTHER_EXE_FILE RCDATA "nameofother.exe"
Merci Ryan. Y a-t-il un moyen de montrer l'EXE stocké dans un TFRAME à l'intérieur de la forme principale de mon application? (comme Adobe Acrobat Reader).
Vous auriez besoin d'enregistrer la ressource sur le disque, puis de le lancer et de le gérer en conséquence. Vous ne pouvez pas, dans la théorie de toute façon, lancer et en mémoire .exe, il doit être sur disque. Il y a des moyens de le faire, mais je crois que cela devient de plus en plus difficile de faire en raison de la menace des chevaux de Troie et des virus faisant le même type de chose. L'autre chose est que votre tentative de faire, je pense que la société stockée doit être enregistrée avec le sous-système COM à utiliser correctement. Je ne vois pas que cela se produirait si vous essayez de l'exécuter de votre candidature, sauf si vous vous enregistrez / dérégiverant à la volée.
Vous aurez besoin de nettoyer le code un peu et de déterminer comment "parler" à Firefox.
Mais voici comment vous pouvez intégrer n'importe quelle application à l'intérieur d'une forme Delphi.
fichier DFM
P>
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.
Merci Catharz: C'est exactement ce que je veux faire. Je vais essayer cela et poster mes résultats ici. Maintenant, ma question est la suivante: puis-je poster des messages à FF? (Ouvrez un nouvel onglet, obtenez la dernière URL visité ..) Encore une fois, merci mo3ez
Je ne l'ai pas regardé moi-même, mais vous pouvez vérifier le code MozDev et voir si vous pouvez utiliser quelque chose à partir de là. Puisque vous voulez utiliser JavaScript, le pont JavaScript est probablement exactement ce que vous voulez. delphi.mozdev.org/source.html Downloads.Mozdev.org/delphi/javascript_bridge.zip
Manque-t-il d'un signe égal? I.e.: si appwnd 0 alors i> doit être si appwnd = 0 alors i>
Quoi qu'il en soit, c'est intéressant. Pouvez-vous indiquer la technique explicitement dans votre réponse? Il s'agit essentiellement de transformer une fenêtre de niveau supérieure exécutable ciblée dans une fenêtre d'enfance de propre application.
MAD70, non, la déclaration IF devrait être "si appwnd n'est pas égale à 0". On dirait que l'analyseur a dépassé les signes moins que et plus grands que les signes lorsque j'ai collé le code. La technique est similaire à quelque chose que l'application que je travaille. Mais il intégre les formes à l'intérieur des pages d'un contrôle de tabulation. Dans l'exemple ci-dessus, j'exègre l'application dans un état caché. Je peux ensuite définir son parent sur n'importe quel contrôle de Windows (dans ce cas un panneau) avant de le cacher. Ceci incorpore l'application à l'intérieur de ce contrôle. Pour une raison quelconque, Showwindow doit être appelé deux fois pour que cela fonctionne.
si (appwnd 0) puis code> doit être
si (appwnd <> 0) puis code> non?
Oui Jerry, tu as raison. J'utilisais des tags avant autour de la source Delphes, qui ne manipulait pas <> correctement.
Je pense que le gars d'origine veut réellement est un moteur de rendu de navigateur Web intégré comme un contrôle de son application. Si tel est le cas, Gecko (la partie Rendu de Mozilla) est disponible sous forme de plugin pour votre application. Je ne pense pas que tu voulais courir un exe. p>
Par exemple, Mozilla Firefox n'est pas simplement un fichier EXE, mais nécessite d'autres éléments, y compris un dossier Profils. Vous n'avez probablement pas pensé à tous les problèmes qui causeraient. P>
Si vous voulez juste un contrôle de navigateur Web, ce n'est pas le moyen de le faire. Essayez cela à la place: http://ftp.newbielabs.com/delphi%20Gecko%20sdk/ https://sourceforge.net/projects/d-gecko/ p>
Merci Warren: Mais comme je l'ai dit dans mon premier post, je ne veux pas intégrer une composante WebBroswer à l'intérieur de mon application (il est TwebBrowser, c'est-à-dire Welper, Mozilla ActiveX ou Gecko SDK), mais montrer une application externe dans l'une de mes fenêtres ( FF dans ce cas). Il est utile de savoir de toute façon: j'ai essayé Gecko SDK Delphi Wrapper et que cela a jugé calme utile. Merci pour le conseil
Parlez-vous d'OLE / COM Inception ou stockez-vous en réalité l'EXE de votre application? Je pense que j'ai mal compris votre question à l'origine.
Dupliqué possible de Stackoverflow.com/Questtions/377215/webkit-support-for -Delphi
Salut Ryan exactement !! OLE / COM L'emboîtement est ce que je veux faire: mais je n'ai pas pu trouver un moyen de le faire avec FF; J'ai trouvé des idées intéressantes (Gecko SDK, Mozilla ActiveX ...), mais ce n'est pas tout à fait ce que j'aimerais faire. Mon objectif est d'afficher l'application FF INSIDEMY (en mode TFRAME.)