Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cuantas veces está abierta una aplicación (https://www.clubdelphi.com/foros/showthread.php?t=40902)

pache 01-03-2007 18:40:39

Cuantas veces está abierta una aplicación
 
Buen día para todos

Podría alguien decirme si conoce una función que me permita saber cuántas veces esta abierta una aplicación. Esto para limitar la cantidad de veces que se pueda abrir, por ejemplo si ya está abierta 3 veces, que no se pueda abrir nuevamente. Yo se como verificar si está abierta con el FindWindow, pero lo que quiero es saber cuantas veces está abierta sin tener que almacenar esto en una tabla.

De antemano, muchas gracias

Bicho 01-03-2007 19:52:58

Hola,

ya que no quieres guardar esa info en una tabla, puedes guardarla en un fichero de texto o en el registro de windows, etc.
Revisa éste hilo.

Saludos

seoane 01-03-2007 23:56:28

Si lo que quieres saber es cuantas instancias de nuestro programa están corriendo a la vez, prueba con esta función:
Código Delphi [-]
uses PsApi;

function CuantosSomos: Integer;
var
  Procesos: array[1..1024] of DWORD;
  Needed, i: DWORD;
  Process: THandle;
  ModName: array[0..MAX_PATH] of Char;
begin
  Result:= 0;
  if EnumProcesses(@Procesos,SizeOf(Procesos),Needed) then
  begin
    for i:= 1 to (Needed div Sizeof(DWORD)) do
    begin
      Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        FALSE,Procesos[i]);
      if Process <> 0 then
      begin
        if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1)>0  then
        begin
          if StrIComp(ModName,PChar(ParamStr(0))) = 0 then
            inc(Result);
        end;
        CloseHandle(Process);
      end;
    end;
  end;
end;

// Por ejemplo
ShowMessage(IntToStr(CuantosSomos));

pache 02-03-2007 15:02:02

Muchísimas gracias Seoane, eso era justo lo que estaba buscando. Funciona perfectamente.

Está buena para la sección de trucos del Club. Hasta pronto.

roman 02-03-2007 17:35:36

¿Y qué pasa si hago una copia del programa y le cambio de nombre?

// Saludos

seoane 02-03-2007 17:50:38

Cita:

Empezado por roman
¿Y qué pasa si hago una copia del programa y le cambio de nombre?

Pues que no seria el mismo programa, si no una copia del mismo. :p

Ahora en serio, no tiene sentido andar moviendo los programas de sitio y esperar que funcionen bien. Así que pasaría lo que tiene que pasar, no funcionaria.

Ahora bien, que queremos hacer la súper aplicación a prueba de balas. Pues se hace, que a mi a matar moscas a cañonazos no me gana nadie :p
Código Delphi [-]
uses PsApi, Hashes;

function FSize(Path: String): Int64;
var
  SearchRec: TSearchRec;
begin
  if FindFirst(Path,faAnyFile,SearchRec) = 0 then
    Result:= SearchRec.Size
  else
    Result:= -1;
  FindClose(SearchRec);
end;

function CuantosSomos: Integer;
var
  Procesos: array[1..1024] of DWORD;
  Needed, i: DWORD;
  Process: THandle;
  ModName: array[0..MAX_PATH] of Char;
  Size: int64;
  Hash: String;
begin
  Result:= 0;
  Size:= FSize(ParamStr(0));
  Hash:= CheckSum(ParamStr(0));
  if EnumProcesses(@Procesos,SizeOf(Procesos),Needed) then
  begin
    for i:= 1 to (Needed div Sizeof(DWORD)) do
    begin
      Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        FALSE,Procesos[i]);
      if Process <> 0 then
      begin
        if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1)>0  then
        begin
          if Size = FSize(String(ModName)) then
            if CheckSum(String(ModName)) = Hash then
              inc(Result);
        end;
        CloseHandle(Process);
      end;
    end;
  end;
end;

La unit hashes se encuentra aquí
http://www.clubdelphi.com/foros/show...22&postcount=4

roman 02-03-2007 17:54:12

Cita:

Empezado por seoanae
Ahora en serio, no tiene sentido andar moviendo los programas de sitio y esperar que funcionen bien. Así que pasaría lo que tiene que pasar, no funcionaria.

Tiene sentido en tanto se pregunta como evitarlo. De otra forma, sólo dígase al usuario que no se puede abrir más de tres veces.

Cita:

Empezado por seoane
a mi a matar moscas a cañonazos no me gana nadie

Pues, hombre, ¿qué decirte? Si te tomas esto como una competencia, pues te declaro vencedor absoluto. No me interesa.

// Saludos

seoane 02-03-2007 18:00:52

Cita:

Empezado por roman
Tiene sentido en tanto se pregunta como evitarlo. De otra forma, sólo dígase al usuario que no se puede abrir más de tres veces.

No es lo mismo, uno puede equivocarse y pulsar varias veces en el icono sin darse cuenta, o abrir una aplicación sin fijarse en que ya estaba abierta y minimizada, por ejemplo. Pero hacer una copia y cambiarle el nombre, me parece un acto consciente ...

Cita:

Pues, hombre, ¿qué decirte? Si te tomas esto como una competencia, pues te declaro vencedor absoluto. No me interesa.
:confused: ¿Competencia? ¿que competencia?, ahora si que me perdí.

roman 02-03-2007 18:04:16

Cita:

Empezado por seoane
No es lo mismo, uno puede equivocarse y pulsar varias veces en el icono sin darse cuenta, o abrir una aplicación sin fijarse en que ya estaba abierta y minimizada, por ejemplo. Pero hacer una copia y cambiarle el nombre, me parece un acto consciente ...

Claro que no es lo mismo. Pero si tu aplicación depende funcionalmente de no poder abrir más de tres instancias, entonces debes asegurarte bien. Y si no depende de eso, entonces, dejen al usuario que abra tantas instancias como quiera.

// Saludos


La franja horaria es GMT +2. Ahora son las 08:24:02.

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