Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将一个应用程序(exe文件)嵌入另一个exe文件(类似mozEmbed)_Delphi_Firefox_Embed_Dde - Fatal编程技术网

Delphi 将一个应用程序(exe文件)嵌入另一个exe文件(类似mozEmbed)

Delphi 将一个应用程序(exe文件)嵌入另一个exe文件(类似mozEmbed),delphi,firefox,embed,dde,Delphi,Firefox,Embed,Dde,我想将mozilla firefox嵌入到我的应用程序中,而不使用任何activex控件(TWebBrowser包装,mozilla activex…)。我尝试使用TWebBrowser(实际上bsalsa的嵌入式webBrowser wich要好得多),但IE的所有版本似乎都与流行的javascript框架和libs(JQuery、ExtJS…)的某些功能不兼容 我的问题是:我可以从我的应用程序中调用firefox的Exe吗(可以使用DDE或OLE),最重要的是在我的应用程序中使用TFrame

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

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

等待你的建议
关于,M

您可以将DLL嵌入到应用程序中并“加载”,然后使用BTMemoryModule.pas(只需在谷歌上搜索即可找到它)

如果此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;
var
//我们自己的COM/OLE对象加载方法!
Lib:HMODULE;
Ptr:TDllGetClassObject;
Unl:TDLLCanUnloadNow;
I:IClassFactory;
初始化
Lib:=LoadLibrary('zkemceeper.dll');
Ptr:=GetProcAddress(Lib,'DllGetClassObject');
Unl:=GetProcAddress(Lib,'DllCanUnloadNow');
如果分配(Ptr)和(Ptr(类CZKEM,IClassFactory,I)S_OK),则I:=nil;
定稿
I:=零;
(零);
//创建IZKEM接口实例
如果未分配(I),则退出;
如果I.CreateInstance(nil,IZKEM,CZ)S_OK,则退出;
如果未分配(CZ),则退出;
我不知道如何嵌入可执行文件


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

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

创建一个包含以下文本的.RC文件:

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

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


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

您需要稍微清理一下代码,并确定如何与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.
unitmain;
接口
使用
窗口、消息、系统工具、变体、类、图形、控件、窗体、,
对话框、StdCtrls、ExtCtrls、ShellApi;
类型
TfrmMain=类(TForm)
pnlTop:TPanel;
btnLoadApp:TButton;
btnKill:t按钮;
程序btnLoadAppClick(发送方:TObject);
程序btnKillClick(发送方:TObject);
私有的
{私有声明}
附件:德沃德;
公众的
{公开声明}
结束;
变量
frmMain:TfrmMain;
实施
{$R*.dfm}
过程TfrmMain.btnLoadAppClick(发送方:TObject);
变量
可执行文件:字符串;
SEInfo:TShellExecuteInfo;
开始
ExecuteFile:=“c:\Windows\notepad.exe”;
FillChar(SEInfo,SizeOf(SEInfo),0);
SEInfo.cbSize:=SizeOf(TShellExecuteInfo);
用SEInfo做
开始
fMask:=见屏蔽过程;
Wnd:=pnlTop.Handle;
lpFile:=PChar(可执行文件);
nShow:=SW_HIDE;
结束;
如果ShellExecuteEx(@SEInfo)那么
开始
AppWnd:=FindWindow(无,PChar('Untitled-Notepad'));
如果应用0,则
开始
SetParent(AppWnd,SEInfo.Wnd);
显示窗口(AppWnd,SW_显示最大化);
显示窗口(AppWnd,SW_显示最大化);
结束;
结束
其他的
ShowMessage('启动记事本时出错!');
结束;
过程TfrmMain.btnKillClick(发送方:TObject);
开始
如果(AppWnd 0),则
开始
PostMessage(AppWnd,WM_Close,0,0);
AppWnd:=0;
结束;
结束;
结束。

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

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

如果您只是想要一个web浏览器控件,那么这不是实现它的方法。请尝试以下方法:

谢谢你,里萨尔特。事实上,我正在寻找一种从我自己的应用程序“监控”firefox(或任何其他应用程序)的方法,比如DDE或COM。我的目标是在不退出我自己的软件的情况下提供该应用程序的功能(出于安全和功能原因:用户只能访问我的应用程序,没有windows资源管理器),因此:您可以在应用程序旁边的机器上安装Firefox,并运行Firefox。它必须在你的一扇窗户内=谢谢你,瑞安。有没有办法在我的应用程序的主窗体内的tframe中显示存储的exe?(如Adobe acrobat Reader)。您需要将资源保存到磁盘,然后启动它并相应地处理它。从理论上讲,无论如何,你不能在内存中启动.exe,它必须在磁盘上。有很多方法可以做到这一点,但我相信这正变得越来越难,因为特洛伊木马和病毒的威胁在做同样的事情。另一件事是,如果您试图使用COM,我相信存储的.EXE必须在COM子系统中注册才能正确使用。如果您尝试在应用程序中运行它,我看不到会发生这种情况,除非您动态注册/取消注册它。您是在谈论OLE/COM嵌入还是在应用程序中实际存储EXE?我想我最初误解了你的问题。可能是Hi Ryan的复制品!!OLE/COM嵌入是我想要做的:但我找不到一种使用ff的方法;我发现了一些有趣的想法(gecko SDK、mozilla activeX…),但这并不是我想要做的。我的去