Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Ok. Te presento un programita que se ejecuta maximizado mostrando un Label que dice "LOADING GAME" al arrancar. Luego Ejecuta "Notepad.exe" y se esconde. Al cerrar Notepad, el programita se termina.


Espero que esta sea la idea de lo que quieres hacer.


Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    function Execute(CommandLine: String): cardinal;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
// Creamos un proceso.
function TForm1.Execute(CommandLine: String): cardinal;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  ZeroMemory(@SI, sizeof(TStartupInfo));
  SI.cb:= sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION or STARTF_USESIZE;
  SI.wShowWindow:= SW_SHOW;
  Result:= 0;
  if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Visible:= false;
    WaitForSingleObject(PI.hProcess,INFINITE);
    GetExitCodeProcess(PI.hProcess, Result);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end
  else
    Result:= $FFFFFFFF;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WindowState:= wsMaximized;
  FormStyle:= fsStayOnTop;
  BorderStyle:= bsNone;
  Label1.Caption:= '"LOADING GAME"';
  Label1.Font.Size:= 30;
  Label1.Font.Style:= [fsBold];


  // Simula que tarda en cargar...
  Timer1.Interval:= 2000;  // Poner Timer1.Interval:= 1 para no esperar nada,
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Simula que tarda en cargar...
  Execute('Notepad.exe');

  Visible:= True;
  Label1.Caption:= 'NOS VAMOS';
  Update;
  Sleep(500);
  Close;
end;

end.


Saludos.
Muchas gracias por tomarte el tiempo que es un recurso irrecuperable.
Esta tarde, en cuanto regrese del trabajo, esto va a ser lo primero que me ponga a hacer.

La verdad es que no me puedo explicar como pudo ser algo tan sencillo y jamás imaginarlo. Ja!
Bueno están los que saben y son fuente inagotable de sabiduría y los que no aprendemos por más ganas que le echemos. 😂 🤣 😂

Te agradezco y más tarde te paso el reporte de como me fue.

Muy agradecido!
Saludos!!!!!
Responder Con Cita
  #2  
Antiguo 09-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Hola acá molestando otra vez.

Sabés que el programa se me queda tildado y no ejecuta nada?
Parece que el problema es acá:

if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI)

Pero no puedo saber por qué.
Me dice error
reised exception class $C00000005 with mesage 'access violation at 0x7788d00: write of adress 0x005eb846'

Qué puede ser?
Responder Con Cita
  #3  
Antiguo 09-03-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por MaxiDucoli Ver Mensaje
Hola acá molestando otra vez.

Sabés que el programa se me queda tildado y no ejecuta nada?
Parece que el problema es acá:

if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI)

Pero no puedo saber por qué.
Me dice error
reised exception class $C00000005 with mesage 'access violation at 0x7788d00: write of adress 0x005eb846'

Qué puede ser?
Tendrás que especificar más cosas, cual es el código exacto que has usado, S.O. y compilador. Para concretar las cosas te subo el proyecto que hice con su binario. Está escrito y compilado con delphi7.

Te propongo un cambio:
Código Delphi [-]
//------------------------------------------------------------------------------
// Creamos un proceso.
function TForm1.Execute(CommandLine: String): cardinal;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  ZeroMemory(@SI, sizeof(TStartupInfo));
  SI.cb:= sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION;// or STARTF_USESIZE;
  SI.wShowWindow:= SW_SHOW;
  Result:= 0;
  if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Visible:= false;
    WaitForSingleObject(PI.hProcess,INFINITE);
    GetExitCodeProcess(PI.hProcess, Result);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end
  else
    Result:= $FFFFFFFF;
end;

Lo puedes encontrar aquí: Exec_Whait_End.zip.


Saludos.
Archivos Adjuntos
Tipo de Archivo: zip Exec_Whait_End.zip (192,5 KB, 12 visitas)

Última edición por escafandra fecha: 09-03-2020 a las 08:16:21.
Responder Con Cita
  #4  
Antiguo 10-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Hola.
Con el Project1.exe funciona.
Muestra el Form, abre cmd.exe y cuando cierro cmd.exe dice NOS VEMOS y se cierra todo.

Pero con el código fuente me da el mismo error.


Uso Windows 10 actualizado a la última versión, Delphi 10.3.1, el códgo lo puse exactamente como me lo mandaste.

Pero me tira el error ese que te indiqué antes.

Que raro.
Responder Con Cita
  #5  
Antiguo 10-03-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Es problema del unicode el delphi. Si se fuerza a usar AnsiChar funcionará. Este problema no ocurre en C, posiblemente esté mas declarada la API.
Prueba este código que si funciona en Berlin y funcionará en tu versión de delphi:


Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    function Execute(CommandLine: AnsiString): cardinal;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
// Creamos un proceso.
function TForm1.Execute(CommandLine: AnsiString): cardinal;
var
  SI: TStartupInfoA;
  PI: TProcessInformation;
begin
  ZeroMemory(@SI, sizeof(TStartupInfoA));
  SI.cb:= sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION;
  SI.wShowWindow:= SW_SHOW;
  Result:= 0;
  if CreateProcessA(0, PAnsiChar(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Visible:= false;
    WaitForSingleObject(PI.hProcess,INFINITE);
    GetExitCodeProcess(PI.hProcess, Result);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end
  else
    Result:= $FFFFFFFF;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow(Handle, SW_MAXIMIZE);
  WindowState:= wsMaximized;
  FormStyle:= fsStayOnTop;
  BorderStyle:= bsNone;
  Label1.Caption:= '"LOADING GAME"';
  Label1.Font.Size:= 30;
  Label1.Font.Style:= [fsBold];
  // Simula que tarda en cargar...
  Timer1.Interval:= 2000;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:= false;
  // Simula que tarda en cargar...
  Execute('cmd.exe');
  Visible:= True;
  Label1.Caption:= 'NOS VAMOS';
  Update;
  Sleep(500);
  Close;
end;

end.

He añadido discretas mejoras y pasado a PAnsiChar.


Saludos.
Responder Con Cita
  #6  
Antiguo 27-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Espectacular!!!!!
Ahora funciona.
Le voy a hacer todas las modificaciones que se necesitan y después te voy a pasar el link para que puedas verlo como quedó, si querés.
Va a ser como empezar desde cero, pero va a valer la pena.

MUCHÍSIMAS GRACIAS!!!!!

Perdón por tardar tanto, pero con esto del virus, mi trabajo me demanda el triple te tiempo y llego muy cansado.

Última edición por Casimiro Noteví fecha: 27-03-2020 a las 21:30:47.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Optimizar codigo n03l Varios 3 28-11-2013 21:07:11
optimizar el codigo en menos lineas darkbits Varios 5 19-07-2013 13:32:40
Ayuda como Optimizar Código JerS OOP 3 24-06-2011 05:59:44
optimizar codigo acrophet Varios 5 16-01-2011 23:28:39
Optimizar el sgte codigo BlueSteel Varios 9 14-08-2007 22:33:24


La franja horaria es GMT +2. Ahora son las 04:11:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi