delphi 调用 EXE 并在Panle中运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 调用 EXE 并在Panle中运行相关的知识,希望对你有一定的参考价值。

求助 delphi 调用外部EXE文件 并在Panle中运行谢谢回复,,,,,, 能给个实例吗?gentleman66@qq.com

界面上就4个常用控件,全部的代码在此,自己照着代码加控件
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
PProcessWindow = ^TProcessWindow;
TProcessWindow = record
TargetProcessID: Cardinal;
FoundWindow: hWnd;
end;
TForm1 = class(TForm)
Button1: TButton;
OpenD: TOpenDialog;
Panel1: TPanel;
Splitter1: TSplitter;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
Private declarations
public
Public declarations
end;
var
Form1: TForm1;
hWin: HWND = 0;
implementation
$R *.dfm

function EnumWindowsProc(Wnd: hWnd; ProcWndInfo: PProcessWindow): BOOL; stdcall;
var
WndProcessID: Cardinal;
begin
GetWindowThreadProcessId(Wnd, @WndProcessID);
if WndProcessID = ProcWndInfo^.TargetProcessID then begin
ProcWndInfo^.FoundWindow := Wnd;
Result := False; // This tells EnumWindows to stop enumerating since we've already found a window.
end else Result := True; // Keep searching
end;
function GetProcessWindow(TargetProcessID: Cardinal): hWnd;
var
ProcWndInfo: TProcessWindow;
begin
ProcWndInfo.TargetProcessID := TargetProcessID;
ProcWndInfo.FoundWindow := 0;
EnumWindows(@EnumWindowsProc, Integer(@ProcWndInfo));
Result := ProcWndInfo.FoundWindow;
end;
function RunAppInPanel(const AppName: string; PanelHandle: HWND): boolean;
var
si: STARTUPINFO;
pi: TProcessInformation;
begin
FillChar(si, SizeOf(si), 0);
si.cb := SizeOf(si);
si.wShowWindow := SW_SHOW;
result := CreateProcess(nil, PChar(AppName), nil,
nil, true, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
if not result then exit;
WaitForInputIdle(pi.hProcess, 10000); // let process start!
hWin := GetProcessWindow(pi.dwProcessID);
if hWin > 0 then begin
Windows.SetParent(hWin, PanelHandle);
SetWindowPos(hWin, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER);
result := true;
end;
// we don't need the handles so we close them
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenD.Execute then begin
if hWin > 0 then PostMessage(hWin, WM_CLOSE, 0, 0); // close any app currently opened
if not RunAppInPanel(OpenD.FileName, Panel1.Handle) then ShowMessage('App not found');
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if hWin > 0 then
PostMessage(hWin, WM_CLOSE, 0, 0);
end;
end.
参考技术A 在uses 中使用ShellAPI;
加一个button; onClick事件
ShellExecute(handle, 'open ', '盘符路径:\project1.exe ', Nil, Nil, SW_SHOWNORMAL);

WinExec( 'project1.exe ',1);
不过这是外部调用,怎么在panel中运行,就不知道了!

调用德尔福 DCOM

【中文标题】调用德尔福 DCOM【英文标题】:Call Delphi DCOM 【发布时间】:2015-07-07 00:08:50 【问题描述】:

我对 Delphi 和 DCOM 完全陌生。我被分配了修改旧的 Delphi 项目的任务。我能够进行更改并构建 .exe。我正在使用 Delphi 7 IDE。

由于某种原因,我们需要旧版本和新版本同时在同一台服务器上运行。

我所做的是,构建了新版本,我们称之为delphiapp_original.exe,将其重命名为delphiapp_new.exe。我们运行应用程序的方式是这样的:

callerapp delphiapp_original.ObjA

callerapp 是另一个调用 Delphi DCOM 对象的应用程序。

我的问题是如何运行我的新 Delphi 应用程序。是吗:

callerapp delphiapp_new.ObjA

我知道我的问题听起来很愚蠢,但我没有要测试的环境,所以我无法尝试该命令。我问的另一个原因是我不确定上述命令行中的delphiapp_originaldelphiapp_new 是exe 的名称还是exe 中某个类/对象的名称。如果它们是 exe 的名称会很好,这样会调用不同的 DCOM 对象。但是如果上面命令行中的delphiapp_original或者delphiapp_new是exe里面的类/对象的名字,那就麻烦了,因为我只是重命名了exe,旧exe和新exe里面的东西都是一样的name,我不知道调用的是哪个对象。

【问题讨论】:

如果你不能测试这个,你就不会成功。 【参考方案1】:

正如您所怀疑的,仅重命名 EXE 文件是不够的。您必须编辑项目的类型库以更改它定义的 COM 对象的 GUID/ProgID。然后,您可以编译 EXE 文件的新版本并运行它,以便使用新的 GUID/ProgID 重新注册其 COM 对象。然后,新旧版本将能够以不同的名称在同一台 PC 上共存。

【讨论】:

以上是关于delphi 调用 EXE 并在Panle中运行的主要内容,如果未能解决你的问题,请参考以下文章

求教在delphi中,如何把一个exe做为res加入到dll中,并在运行时生成exe文件执行

求教在delphi中,如何把两个exe做为res加入到另一个exe中,并在运行时释放两个exe

delphi 调用exe 无输出

delphi 如何把其他exe文件加入dll中,并调用

delphi 调用外部exe ,并等待调用程序运行结束

如何关闭运行中的excel.exe delphi