zoukankan      html  css  js  c++  java
  • 把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 

  • 相关阅读:
    Django——Model
    正则表达式
    day03数据类型
    创建一个 Django 项目
    JAVA获取MYSQL数据库表、字段、字段类型、字段注释
    Django
    取splist的某个字段的值
    如何获取列表项的创建者的邮件地址
    使用 HTML 表单 Web 部件筛选并显示另一 Web 部件中的数据
    vs2010+Aspx进行sharepoint2010工作流开发(1)
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/5997534.html
Copyright © 2011-2022 走看看