![]() |
evitar doble ejecucion en el programa...
Saludos
tengo una pregunta para implementar el codigo de evitar doble ejecucion de la aplicacion por medio de semaforos, en mi caso en la forma principal ejecuto en el evento Oncreate codigo para las excepciones, y en el evento onshow lo uso para lanzar una forma de password. el codigo de semaforos es este: procedure TfrmPrinc.FormCreate(Sender: TObject); var Sem : THandle; begin Sem := CreateSemaphore(nil,0,1,'PROGRAM_NAME'); if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then begin CloseHandle( Sem ); ShowMessage('This program is already running.'+ 'Este programa ya se está ejecutando...'); Halt; end; end; lo que hice es declarar un procedimiento llamado procedure Ejecucion(); en la seccion private del form principal, y luego lo llamo en oncreate Ejecucion; Application.OnException:= EcepcionException; CargarDiccionario(ExtractFilePath(Application.ExeName) + NombreDiccio); //para que capte las excepciones. se ejecuta sin problemas pero si lo ejecuto otra vez me da el error programado de doble ejecucion pero despues me da el error que ha efectuado operacion no admitida, y el error runtime error 216 at 000587b9. yo lo probe en una aplicacion sencilla en oncreate y funciona por que no le estoy agregando mas codigo de las excepciones, ahora que lo estoy implementando no resulta, hay algo para evitar esto. mucha gracias. |
encontre el siguiente codigo en trucomania
Cita:
|
Pues. Yo utilizo una UNIT que tiene ROMAN publicada en su pagina del club delphi que sirve para eso, por demas es excelente, pruebala.
|
Donde esta la unit esa, podrias ponerla Edgusano. No la veo. O que la ponga roman. saludos.
|
|
saludos
tengo un error que me marca en la funcion declarada en la parte de private: private function ProgramaAbiertoDosVeces:Boolean; ---->>error. { Private declarations } --->>[Warning] uSistema.pas(99): Variable 'Handle1' might not have been initialized en donde debe declararse esta variable, ya la coloque afuera despues de la declaraciones privadas y publicas y aun asi da el error en este caso esta dentro de la funcion: var Handle1 :Hwnd; {thandle} gracias |
Yo tambien he utilizado este metodo y me funciona muy bien, lo unico que tienes q hacer es seguir las instrucciones de la pagina. Agrega el archivo .pas a tu proyecto igual como viene en la pagina y agregalo al modulo del programa principal (dpr) en la clausula uses, como dice en la pagina para que se ejecute primero. Es todo lo que tienes que hacer.
|
La solucion:
Directamente en el DPR:
|
Estaba buscando información sobre otra cosa y he ido a dar con este hilo. Aunque es ya de hace unos meses os pongo aquí como lo resuelvo yo en BCB.
En el fichero que lanza la aplicación (el .cpp asociado a su homónimo .bpr): Código:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) |
Mutex, no olviden el Mutex.
Google: delphi + mutex + example |
La franja horaria es GMT +2. Ahora son las 09:35:55. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi