Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "WinAPI";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

WinExec neponyatka Encontrar ramas similares


Besa   (2001-09-11 11:11) [0]

Buen dia Neponyatka aquí es esto: WinExec en el siguiente ejemplo funciona bien
WinExec ("arj ac: \ temp \ Db.arj c: \ temp \ Db.txt", SW_SHOW)
pero si intento pasar una variable (ver abajo)
1 var.
WinExec ("arj ac: \ temp \ Db" + ORG + ".arj c: \ temp \ Db" + "ORG" + ".txt", SW_SHOW)
2 var.
WinExec (Str1, SW_SHOW)
error de golpes
[Error] Unit1.pas (88): tipos incompatibles: "String" y "PChar"
y DeleteFile funciona bien
Ejemplo de código:

var DUBL, ORG, Str1: String;
i, y: Entero;
F: System.Text;

comenzar
Query1.Active: = True;
Query1.First;
ORG: = Query1.FieldByName ("pr_org"). AsString;
Str1: = "arj ac: \ temp \ Db" + ORG + ".arj c: \ temp \ Db" + ORG + ".txt";

si WinExec ("arj ac: \ temp \ Db" + ORG + ".arj c: \ temp \ Db" + "ORG" + ".txt", SW_SHOW) <32
entonces
comenzar

final
más
if deletefile ("c: \ temp \ Db" + ORG + ". txt")
entonces
ShowMessage (DELETE! ")
más
ShowMessage ("Not DELETE!");
dime, por favor, que estoy equivocado



Digitman   (2001-09-11 11:29) [1]

WinExec (PChar (Str1), SW_SHOW)

¿Y qué, en su opinión, no hay diferencia entre la cadena y PChar? profundamente equivocado!



Юрий Зотов   (2001-09-11 11:32) [2]

En eso se pasa un parámetro de cadena donde se requiere PChar. En el caso de una constante, el compilador hace todo por sí mismo, y en el caso de una variable, usa una conversión de tipo explícita:

WinExec (PChar ("arj ac: \ temp \ Db" + ORG + ".arj c: \ temp \ Db" + "ORG" + ".txt"), SW_SHOW);

WinExec (PChar (Str1), SW_SHOW);



Besa   (2001-09-11 11:43) [3]

> Todos
¡Gracias!
Perdonas al ignorante que distrae ... :)



Besa   (2001-09-11 19:09) [4]

> Todos
Una vez más, el ignorante molesta
WinExec devuelve el código de terminación> 31, luego se ejecuta ...
pregunta:
1) ¿funcionó este programa llamado (en el sentido de esperar la finalización del programa externo)? es decir, En este ejemplo, ¿es posible eliminar antes de archivar?
2) cómo obtener errorlevel desde un programa externo
3) desea saber: este y todos los códigos de finalización devueltos por el sujeto
0 El sistema no tiene memoria o recursos.
ERROR_BAD_FORMAT El archivo .EXE no es válido (no es Win32 .EXE o error en la imagen .EXE).
ERROR_FILE_NOT_FOUND No se encontró el archivo especificado.
ERROR_PATH_NOT_FOUND No se encontró la ruta especificada.
Gracias de antemano



Юрий Зотов   (2001-09-11 22:40) [5]

1. No, no esperando. Simplemente comienza, y eso es todo, y lo que sucederá después, nadie lo sabe.

2. Obtenga el identificador de su proceso, espere a que se complete y llame a GetExitCodeProcess.

3. No hay otros códigos en la ayuda. Supongo que eso es todo.

Parece que necesitas usar la función CreateProcess, que facilita la combinación de todo "en una botella". Este es un ejemplo práctico de cómo iniciar un programa externo, esperar su finalización, obtener el código de retorno y llamar al controlador de eventos al final.

unidad Unit1;

interfaz.

usos
SysUtils, Classes, Controls, Forms, StdCtrls;

tipo
TForm1 = clase (TForm)
Button1: TButton;
procedimiento Button1Click (Sender: TObject);
privada
procedimiento ThreadFinished (Sender: TObject);
fin;

var
Form1: TForm1;

implementación

usos
Unit2;

{$ R * .DFM}

procedimiento TForm1.Button1Click (Sender: TObject);
comenzar
// Crear y configurar el segundo hilo. Lanzará un programa externo.
// espere hasta que se complete, llame a nuestro manejador y dé un código de retorno.
con TMyThread.Create (Falso) hacer
comenzar
CommandLine: = "Notepad.exe AutoExec.bat"; // Sustituye tu
WorkingDirectory: = "C: \"; // Sustituye tu
OnTerminate: = ThreadFinished
final
fin;

procedimiento TForm1.ThreadFinished (Sender: TObject);
comenzar
// El programa externo ha finalizado. El segundo hilo ya no es necesario.
con TMyThread (Remitente) hacer
comenzar
Título: = IntToStr (ExitCode);
Evaluación Gratis
final
fin;

fin.

=========================================

unidad Unit2;

interfaz.

usos
Windows, Clases;

tipo
TMyThread = class (TThread)
privada
FCommandLine: string;
FWorkingDirectory: string;
Código de salida: DWORD;
protegido
Procedimiento de ejecución; anular
público
propiedad CommandLine: string read FCommandLine write FCommandLine;
propiedad WorkingDirectory: string read FWorkingDirectory write FWorkingDirectory;
propiedad ExitCode: DWORD lee FExitCode;
fin;

implementación

procedimiento TMyThread.Execute;
var
SI: TStartupInfo;
PI: TProcessInformation;
comenzar
// Preparar la estructura SI
ZeroMemory (@SI, SizeOf (SI));
SI.cb: = SizeOf (SI);
// Intentando ejecutar un programa externo
si CreateProcess (nil, PChar (FCommandLine), nil, nil, False, 0, nil, PChar (FWorkingDirectory), SI, PI) entonces
comenzar
CloseHandle (PI.hThread); // Liberar recursos innecesarios del sistema.
// Estamos esperando la finalización de la comprobación 1 terminada una vez por segundo.
mientras no está terminado y (WaitForSingleObject (PI.hProcess, 1000) = WAIT_TIMEOUT) do;
// O bien obtenemos, o formamos el código de retorno (debe haber un esquema booleano corto)
si finalizado o no, GetExitCodeProcess (PI.hProcess, FExitCode) entonces FExitCode: = $ FFFFFFFF;
CloseHandle (PI.hProcess) // Recursos del sistema innecesarios gratuitos
final
else FExitCode: = GetLastError // El lanzamiento falló, averigüe el motivo
fin;

fin.



Besa   (2001-09-12 09:56) [6]

> Yuri Zotov
MUCHAS GRACIAS!
Acumulado más códigos de finalización en el libro de Arkhangelsk "Delphi 5"
Si es necesario, puedo reimprimir y publicar, no pregunto porque soy perezoso, sino porque no hago doble trabajo si otros ya lo han hecho en este sitio.
Y Yuri, ¿puedo referirme a usted para agregar un artículo?
http://delphi.mastak.ru/articles/winexec/index.html
con tu ejemplo, porque En este artículo, por lo que tengo entendido, la ayuda de Delphi se describe en ruso y no dice nada sobre la interacción con programas externos.



Юрий Зотов   (2001-09-12 15:24) [7]

Suplemento, si hay un deseo, un asunto útil, por qué no. Solo que creo que, antes de complementar el artículo, sería necesario obtener el consentimiento de su autor, Mikhail Podmogov. O escribe tu propio artículo independiente.

Y mas Si FWorkingDirectory es una cadena vacía (lo cual es bastante normal y podría serlo fácilmente), entonces PChar (FWorkingDirectory) dará un error. En este caso, en el parámetro CreateProcess correspondiente, es necesario pasar simplemente nulo y, por lo tanto, el código del método TMyThread.Execute es conveniente que se modifique ligeramente. Por ejemplo:

var
PWorkDir: PChar; // Otra variable local en Ejecutar.
...Venta de Casas y Condominios en Calgary. Fernando Aramburu agente inmobiliario
si FWorkingDirectory = ""
entonces PWorkDir: = nil
else PWorkDir: = @FWorkingDirectory [1];

Y ahora transferimos PWorkDir.

Sin embargo, puede dejarlo como está, solo para mencionarlo en el texto. "La captura del león domesticado en el desierto del Sahara se proporciona al lector como un ejercicio independiente" (del libro "Broma de los físicos").



Besa   (2001-09-12 17:20) [8]

> Yuri Zotov
Gracias!
Carta a Michael, ya la he enviado. Esperaré una respuesta.
en su silenok puede no ser suficiente, pero lo intentaré.



handra   (2001-09-12 19:24) [9]

Otra opción para comenzar y esperar a que se complete:

función ExecAndWait (const fname, params: string; nShowCmd: Cardinal): boolean;
datos var: TShellExecuteInfo;
comenzar
Resultado: = falso;
data.cbSize: = sizeof (data);
data.fMask: = SEE_MASK_DOENVSUBST o SEE_MASK_NOCLOSEPROCESS;
data.Wnd: = 0;
data.lpVerb: = nil;
data.lpFile: = PChar (fname);
data.lpParameters: = PChar (params);
data.lpDirectory: = nil;
data.nShow: = nShowCmd;
ShellExecuteEx (@data);
mientras que la verdad comienza
Aplicación.Procesos de proceso;
caso WaitForSingleObject (data.hProcess, 100) de
WAIT_FAILED: Resultado: = falso;
WAIT_OBJECT_0: Resultado: = verdadero;
de lo contrario continuar
fin;
break;
fin;
fin;



Delirium   (2001-10-08 18:59) [10]

¿Y solo WinExec es débil (PChar ("....."), SW_SHOW)?



vovan1   (2001-11-07 18:15) [11]

Caballeros, ayuden por favor! Probé el código dado por Yu. Ozerov, funciona, pero el problema es este: ¿cómo colocar varios archivos en el archivo? Si hago un ciclo, con el archivador llamado en una secuencia separada para cada archivo, entonces solo tengo uno o dos archivos en el archivo, ¡pero necesito cuatro! ¿Cómo salir de esta situación? ¿Cómo ralentizar la ejecución del siguiente proceso, hasta que el anterior funcione? AYUDA !!!!



Páginas: 1 rama entera

Foro: "WinAPI";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba





Memoria: 0.6 MB
Tiempo: 0.028 c
1-22045
Socol
2001-12-15 17:14
2002.01.08
Escribir en archivo.


3-21906
Yuri Zhukov
2001-11-21 09:40
2002.01.08
Oracle ADO vs DOA - fido7.ru.delphi.db


6-22301
Chino que
2001-10-10 14:45
2002.01.08
¿Esclerosis o qué?


3-21958
bk
2001-12-05 19:15
2002.01.08
Pomogite kto moget ado unikal nomer


14-22323
Melamed
2001-11-04 19:57
2002.01.08
¿Cómo corregir estos datos personales, registrados en el registro?





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish French
gallego georgiano Alemán Griego criollo haitiano Hebreo hindi Húngaro islandés Indonesian irlandés Italiano Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese Rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español