/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Pedido

 
      Índice del Foro elrincondelc.com -> Dev-C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
hubel



Registrado: 15 Ago 2011
Mensajes: 2
Ubicación: venezuela

MensajePublicado: 15/08/2011 7:56 am
Título: Pedido

Hola a todos quisiera saber si alguien me puede ayudar a crear una dll que sea capaz de ser injectada a un programa.exe, que tengo y este verifique si el mismo se esta ejecutando o el programa esta en curso, y no deje abrir el programa mas de 1 vez en la misma pc.
En resumen solo quiero que mi programa.exe sea ejecutado 1 vez por pc. y no varias veces a la vez.
el nombre del proceso se llama Gunz.exe

tengo este codigo pero no me funciona:

#include <Windows.h>

BOOL WINAPI main(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH)
{
try{

DEP_SYSTEM_POLICY_TYPE isDep = GetSystemDEPPolicy();
if(isDep == 1)
{
MessageBox(NULL, "Windows Data Execution Prevention is currently in AlwaysOn mode. Gunz cannot start. Please consult the games forum for information on fixing this error.", "Error", MB_OK);
return TRUE;
}

if(isDep == 2 || isDep == 3)
{
SetProcessDEPPolicy(0);
}

}catch(...){
MessageBox(NULL, "Unable to detect current DEP Policy. Consider upgrading your operating system to Windows XP Service Pack 3 or newer. If GunZ does not run normally, please consult the games forum for more information. If you are seeing this warning in error, please let me know about it.", "Warning", MB_OK);
}

CreateMutex(NULL, true, "Gunz");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(NULL, "GunZ ya se encuentra en ejecucion.", NULL, MB_OK);
ExitProcess(0);
return true;
}
return true;
}
}
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 15/08/2011 9:41 am
Título:

Hola,

De nuevo aparezco con mis respuestas raras.

Verás, tengo una aplicación en mi página que monitoriza y muestra las páginas que han impreso las impresoras que hay conectadas a un ordenador.

El caso es que la información se guarda en una base de datos de 'sqlite'.

Pues bien, no me interesa para nada que la aplicación se ejecute 2 veces.
Pero lo que no me interesa es que 2 ejecutables con el mismo nombre se ejecuten 2 veces. No creo que sea el caso y no sé si te servirá. El código de la función que se encarga de ello está en free pascal. Y es el siguiente (Si ya sé que no es C, pero se parece mucho):

Código:

procedure iebArrancarSiNoHayOtraInstancia();
var
  hvv: HANDLE;
  pe32: PROCESSENTRY32W;
  cadenamensaje: array[0..200] of widechar;
  cadenatitulo: array [0..200] of widechar;
  miruta: array [0..300] of widechar;
begin
  GetModuleFileNameW(0, PWideChar(miruta), 299);
  PathStripPathW(PWideChar(miruta));
  MessageBoxW(0, miruta, miruta, MB_OK);
  hvv := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 1);
  if hvv = INVALID_HANDLE_VALUE then
    mostrarerror(WideString({$INCLUDE %FILE%}), WideString({$INCLUDE %LINE%}));
  pe32.dwSize := sizeof(PROCESSENTRY32W);
  if Process32FirstW(hvv, pe32) = False then
    mostrarerror(WideString({$INCLUDE %FILE%}), WideString({$INCLUDE %LINE%}));
  repeat
    if StrCmpIW(pe32.szExeFile, PWideChar(miruta)) = 0 then
    begin
      if GetCurrentProcessId() <> pe32.th32ProcessID then
      begin
        LoadStringW(GetModuleHandle(nil), 10003, PWideChar(cadenamensaje), 118);
        LoadStringW(GetModuleHandle(nil), 10001, PWideChar(cadenatitulo), 118);
        MessageBoxW(0, PWideChar(cadenamensaje), PWideChar(cadenatitulo), MB_OK);
        CloseHandle(hvv);
        halt(0);
      end;
    end;
  until Process32NextW(hvv, pe32) = False;
  CloseHandle(hvv);
end;         


Es que me ha dado por aprender pascal.

Este código evita que el programa se ejecute si hay otro proceso con el mismo nombre que el que contiene la función en ejecución.

Si lo que quieres evitar es que alguien le cambie el nombre al programa y lo ejecute a la vez que el tuyo tendrás que intentar crear algún objeto tipo mutex, evento o similar con nombre y comprobar si ya existe o algo así.

En fin, espero que te sirva y que me perdonen los expertos por mi código.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
hubel



Registrado: 15 Ago 2011
Mensajes: 2
Ubicación: venezuela

MensajePublicado: 15/08/2011 12:45 pm
Título:

Hola, lo siento pero no es lo que busco, lo q quiero es una dll el cual inyectare al ejecutable gunz.exe, usando ASM, no se ejecute varias veces en la misma pc. y si lo ejecuto veces no me deje hacerlo y salga un mensaje que diga el programa esta en ejecucion y no puede ser abierto nuevamente.
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 17/08/2011 7:19 am
Título:

Hola de nuevo,

Perdona, pero no acabo de entender tu mensaje.

Utilizando un código parecido al tuyo:

Código:


#include <windows.h>
///////////////////////////////////////////////////
int main()
{
    HANDLE han;
    han = CreateMutex(NULL, TRUE, "miprograma.exe");
    if(han != NULL)
    {
        if(GetLastError() == ERROR_ALREADY_EXISTS)
        {
            MessageBox(NULL, "ya se está ejecutando", "El programa", MB_OK);
            CloseHandle(han);
        }
        else
        {
            MessageBox(NULL, "Vuelve a iniciar el programa sin cerrar este cuadro",
                "Hola", MB_OK);
            CloseHandle(han);
        }
    }
    return 0;
}



Ah, por cierto, en tu código haces cosas que no te aconsejo hacer.

Utilizas el punto de entrada que se conoce como DllMain para hacer llamadas a dlls como user32.dll (distinta de kernel32.dll) (MessageBox). Si te da problemas, utiliza una función de inicialización distinta y hecha por ti. Lo que haces es peligroso. Espero que sepas lo que haces, aunque yo no lo haría.

Lo que no sé es para qué quieres la dll (se trata de 20 líneas), ni para qué usas el assembly. En fin, el programa lo haces tú.

Espero que te ayude.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
      Índice del Foro elrincondelc.com -> Dev-C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com