6

我想将 mozilla firefox 嵌入到我的应用程序中,而不使用任何 activex 控件(TWebBrowser 包装器、mozilla ActiveX ...)。我尝试使用 TWebBrowser(实际上 bsalsa 的嵌入式 webBrowser 更好),但所有版本的 IE 似乎与流行的 javascript 框架和库(JQuery、ExtJS ...)的某些功能不兼容。

我的问题是:我可以从我的应用程序中调用 firefox 的 Exe(是否可以使用 DDE 或 OLE),最重要的是使用 TFrame 或类似的东西在我的应用程序中显示它?

等待您的建议问候,M

4

4 回答 4

6

您需要稍微清理一下代码,并弄清楚您将如何与 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.
于 2010-02-01T07:25:45.530 回答
2

您可以将 DLL 嵌入到您的应用程序中并“加载”,然后使用 BTMemoryModule.pas(只需 google 即可找到它)。

如果此 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;

我不知道如何嵌入可执行文件。

我希望这些信息有所帮助。

于 2010-01-28T13:44:52.447 回答
0

将 EXE 嵌入到应用程序中的最简单方法是将其添加为资源。

制作一个 .RC 文件,其内容类似于以下文本:

OTHER_EXE_FILE  RCDATA "nameofother.exe"

然后使用 brcc32.exe,您可以编译一个与 .RC 同名的 .RES 文件,然后您可以在应用程序中包含 ($I) 新的 .RES 文件。NAMEOFOTHER.EXE 必须与 .RC 文件位于同一文件夹中或正确路径,IIRC。

据说还有另一种方法可以做到这一点。您不使用命令行 brcc32.exe 编译器,只需将 ($I) .RC 文件包含到您的程序中,编译器就会即时编译 .RC 文件。

无法告诉您第二种方法是否有效,因为我从未尝试过。

于 2010-01-28T15:01:38.370 回答
0

我认为最初的人真正想要的是一个嵌入在他的应用程序中的 Web 浏览器渲染引擎作为控件。如果是这样,Gecko(mozilla 渲染部分)可作为您应用程序的插件使用。我认为您不想运行 EXE。

例如,Mozilla Firefox 不仅仅是一个 EXE 文件,它还需要其他东西,包括配置文件文件夹。您可能还没有考虑过会导致的所有问题。

如果您只想要一个 Web 浏览器控件,这不是这样做的方法。试试这个:http: //ftp.newbielabs.com/Delphi%20Gecko%20SDK/ https://sourceforge.net/projects/d-gecko/

于 2010-02-10T17:17:46.057 回答