Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

christianhess

Executar um EXE

Recommended Posts

Bem existem varias maneiras, mas a melhor forma é utilizar o ShellExecute.Exemplo:uses ShellAPI;procedure TForm1.Button1Click(Sender: TObject);beginShellExecute(0, 'open', 'c:\teste\teste.exe, '+set default 1', 'c:\teste', SW_NORMAL);end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quizer controlar a forma de execução do programa, você pode criar um componente como a seguir:

 

APPEXEC.PAS

 

unit Appexec;

 

interface

 

uses

  SysUtils, WinTypes, WinProcs, Messages, Classes, Controls,  Forms, CloseApp;

 

type

  TShowType = (S_HIDE, S_MINIMIZE, S_RESTORE, S_SHOW, S_SHOWMAXIMIZED,

              S_SHOWMINIMIZED, S_SHOWMINNOACTIVE, S_SHOWNA, S_SHOWNOACTIVATE,

              S_SHOWNORMAL);

 

  TAppExecute = class(TComponent)

  private

    fAppName,

    fAppParam: string;

    fWaitForEnd: Boolean;

    fShowType: TShowType;

    fAppInstance: Integer;

    fOnAppExec,

    fOnClose: TNotifyEvent;

  public

    procedure Execute;

    procedure Close;

    constructor Create(aOwner: TComponent); override;

  published

    property AppName: string read fAppName write fAppName;

    property AppParam: string read fAppParam write fAppParam;

    property WaitForEnd: Boolean read fWaitForEnd write fWaitForEnd default False;

    property ShowType: TShowType read fShowType write fShowType;

    property AppInstance: Integer read fAppInstance;

    property OnExecute: TNotifyEvent read fOnAppExec write fOnAppExec;

    property OnClose: TNotifyEvent read fOnClose write fOnClose;

  end;

 

procedure Register;

 

implementation

 

constructor TAppExecute.Create(aOwner: TComponent);

begin

  inherited Create(aOwner);

  fAppInstance := 0;

  fShowType := S_SHOW;

end;

 

 

procedure TAppExecute.Execute;

var

  Buff: array [0..80] of Char;

  Cmd: string;

  Res, fShow: Integer;

begin

  Cmd := fAppName + ' ' + fAppParam;

  StrPCopy(Buff, Cmd);

 

  case fShowType of

    S_HIDE              : fShow := SW_HIDE;

    S_MINIMIZE          : fShow := SW_MINIMIZE;

    S_RESTORE          : fShow := SW_RESTORE;

    S_SHOW              : fShow := SW_SHOW;

    S_SHOWMAXIMIZED    : fShow := SW_SHOWMAXIMIZED;

    S_SHOWMINIMIZED    : fShow := SW_SHOWMINIMIZED;

    S_SHOWMINNOACTIVE  : fShow := SW_SHOWMINNOACTIVE;

    S_SHOWNA            : fShow := SW_SHOWNA;

    S_SHOWNOACTIVATE    : fShow := SW_SHOWNOACTIVATE;

    S_SHOWNORMAL        : fShow := SW_SHOWNORMAL;

  end;

 

  if Assigned(fOnAppExec) then fOnAppExec(Self);

  fAppInstance := WinExec(Buff, fShow);

 

  if fWaitForEnd then

  Repeat

    Res := GetModuleUsage(fAppInstance);

    Application.ProcessMessages;

  until Res = 0

end;

 

procedure TAppExecute.Close;

var

  Res: Integer;

begin

  Res := GetModuleUsage(fAppInstance);

  if Res <> 0 then

  begin

    if Assigned(fOnClose) then fOnClose(Self);

    CloseAppFromInst(fAppInstance);

  end;

end;

 

procedure Register;

begin

  RegisterComponents('AC', [TAppExecute]);

end;

 

end.

Unit contendo a função para fechar uma aplicação:

 

 

CLOSEAPP.PAS

 

unit CloseApp;interfaceuses WinTypes;procedure CloseAppFromInst(HInst: THandle);implementationuses WinProcs, Messages;function EnumWindowsProc(Handle: HWND; Info: Pointer): boolean; export;begin  Result := TRUE; { continue enumeration }  if GetWindowWord(Handle, GWW_HINSTANCE) = LongInt(Info) then begin    PostMessage(Handle, WM_CLOSE, 0, 0);     Result := FALSE;   end;end;procedure CloseAppFromInst(HInst: THandle);begin  EnumWindows(@EnumWindowsProc, LongInt(HInst));end;end.

Barrakuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem existem varias maneiras, mas a melhor forma é utilizar o ShellExecute.Exemplo:uses ShellAPI;procedure TForm1.Button1Click(Sender: TObject);beginShellExecute(0, 'open', 'c:\teste\teste.exe, '+set default 1', 'c:\teste', SW_NORMAL);end;

Mas há um problema, é um servidor de jogo que se iniciará e se eu colokar ShellExecute(0, 'open', 'c:\teste\teste.exe, '+set default 1', 'c:\teste', SW_NORMAL); vai dar erro no '+set default 1', e mostra uma pasta errada e o servidor não consegue abrir os arquivos pois mostra também a pasta onde minha aplicação está... teria que executar um arquivo que está em alguma pasta que o usuário irá escolher em alguma parte do programa... entaum a extensão fica CaminhoCaminhoT := ExtractFilePath(PChar(caminho));ShellExecute(0, 'open', PChar(caminho + ' +set default ' +n), '', 'caminhoT', SW_NORMAL);e ai, ele nem abre o servidor, e agora???

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.