把exe嵌入到自己的exe中。delphi xe3

下面是一个把exe程序嵌入到我们自己的exe中。开发环境 Delphi XE3 Version 17.0.4625.53395。OS环境WIN7 SP1,由于xe3版本的引用库发生变化。换成其他版本的需要做对应的修改。

unit insexe;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    pnl1: TPanel;
    btn1: TButton;
    dlgOpen1: TOpenDialog;
    procedure btn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    FhProc: HWND;
  public
    { Public declarations }
  end;

  PProcessWindow = ^TProcessWindow;

  TProcessWindow = record
    TargetProcessID: Cardinal;
    FoundWindow: HWND;
  end;

var
  Form1: TForm1;

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; // stop enumerating since a window found.
  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;

procedure TForm1.btn1Click(Sender: TObject);
var
  si: STARTUPINFO;
  pi: TProcessInformation;
  bRet: Boolean;
begin
  if not dlgOpen1.Execute then
    Exit;

  FillChar(si, SizeOf(si), 0);
  si.cb := SizeOf(si);

  si.dwFlags := STARTF_USESHOWWINDOW;
  // MUST, otherwise, wShowWindow won‘t work.
  si.wShowWindow := SW_HIDE;
  // Hide the process Windows, otherwise could be trouble.
  bRet := CreateProcess(nil, PChar(dlgOpen1.FileName), nil, nil, True,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi);

  if not bRet then
    Exit;

  // Wait until child process exits.
  WaitForSingleObject(pi.hProcess, 100); // minor delay

  FhProc := GetProcessWindow(pi.dwProcessID);
  if FhProc > 0 then
  begin
    Winapi.Windows.SetParent(FhProc, pnl1.Handle);
    SetWindowPos(FhProc, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER);
    ShowWindow(FhProc, SW_SHOW);
  end;

  // Clear up
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if FhProc > 0 then
    PostMessage(FhProc, WM_CLOSE, 0, 0);
end;

end.

参考:http://hi.baidu.com/wang_yu_136/item/9c6d0ad877a4fa19d90e44fc

时间: 2024-10-21 05:46:32

把exe嵌入到自己的exe中。delphi xe3的相关文章

把任意的EXE嵌入到自己程序中

把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传 Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175KB 资源得分: (42位用户参与评分) 把任意的EXE嵌入到自己程序中 进入下载页 收藏(1) 评论(14) 举报 VIP下载  免积分60元/年(1200次) 相关推荐 把任意的EXE嵌入到自己程序中 把任意的EXE嵌入到自己程序中 您可能还需要 Web程序设计 ...简单的C#宿...matlab

把EXE可执行文件等作为资源包含在Delphi编译文件中

摘自我自己过去写的一段心得. 1.编辑资源文件 *.RCWave: 资源文件是声音文件:RCDATA: 二进制数据AVI: AVI动画:ICON: 图标文件:BITMAP: 位图文件:CURSOR: 光标文件:比如:MyWav WAVE "FileName.Wav" 2.使用Brcc32转化为*.RES文件 3.在工程中引用RES文件比如:{$R MyRes.RES} 4.运行时读入    通过TResourceStream ,比如TResourceStream.Create(HIns

VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下 本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: <span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,

解决pip install package时Fatal error in launcher: Unable to create process using &#39;&quot;e:\python36\python3.exe&quot; &quot;E:\python36\Script\pip3.exe&quot;问题

pip 运行报错: 关于:Fatal error in launcher: Unable to create process using '"e:\python36\python3.exe"  "E:\python36\Script\pip3.exe"问题 由于安装tensorflow,下载 了Anaconda2环境,自此python有了2.7 和3.6两个版本,同时在tensorflow虚拟环境中安装了python3.5版本用来运行tensorflow. 今天本想

Vue 将一个组件嵌入到另一个组件中

App.vue是所有组件的 要嵌入到App.vue组件中, 在script处导入 import xxx  from './components/Helloxxx' 在export default中加入自己的组件 最后在template处,导入自己的组件即可 logo是在app.vue中添加的 篮框是在helloword中添加的,引入到app 红框是在helloLady中添加的,引入到app 原文地址:https://www.cnblogs.com/qianjinyan/p/10893472.ht

python:python2与python3共存时,pip冲突,提示Fatal error in launcher: Unable to create process using &#39;&quot;d:\python27\python2.exe&quot; &quot;D:\Python27\Scripts\pip2.exe&quot; &#39;

问题背景: 机器上同时装了python2.和python3后,导致只能用pip3了,使用pip2时提示:Fatal error in launcher: Unable to create process using '"d:\python27\python2.exe"  "D:\Python27\Scripts\pip2.exe" ' 解决方法: 执行 python -m pip,这种方式代替pip2,同理pip3如果失效,可以使用python3 -m pip代替p

Delphi XE8中Delphi和JAVA数据类型对应关系!

Delphi XE8中Delphi和Java数据类型对应关系所在单元文件:Androidapi.JNI.JavaTypes 对应关系: JObject = interface;//java.lang.Object JInputStream = interface;//java.io.InputStream JByteArrayInputStream = interface;//java.io.ByteArrayInputStream JOutputStream = interface;//jav

对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完 已知的坑 1.因为启动的exe进程并非游戏进程,所以通过QProcess的状态来判断Ue4是否启动是不对的,推荐使用WINAPI来获取对应线程. 2.可以在项目设置中修改窗口显示标题,可以把讨厌的(32-bit, PCD3D_SM5)去掉,强烈推荐使用窗口句柄查看工具,我是网上下了句柄精灵.(窗口标题后面都是有空格的) 嵌入Qt后,UE4无法接受键盘鼠标输入 使用 以下函数

如何将Gate One嵌入我们的Web应用中

参考文档http://liftoff.github.io/GateOne/Developer/embedding.html 从https://github.com/liftoff/GateOne下载的Gate One源代码中,在gateone/tests/hello_embedded中有关于如何将Gate One嵌入我们应用的指导说明.本篇随笔就是根据该指导进行处理,然后写的笔记. 1. 基本嵌入方式 首先先使用一个div来存放我们的Gateone,如下所示, <div id="gateo