wait() en c++ (windows)

Iniciado por soyloqbuskas, 21 Diciembre 2011, 20:46 PM

0 Miembros y 2 Visitantes están viendo este tema.

soyloqbuskas

¡Buenas a todos!

Quiero esar la funcion wait() en c++ para windows y el compilador dice que esta funcion no la tengo definida.
Asi que el error esta en que no tengo incluida la libreria adecuada. En linux es sys/wait.h y ¿en windows cual es?
Segun he leido por google, la libreria es unistd.h pero esta ya la tengo incluida y me sigue dando el mismo error.

Estas son mis librerias:
    #include<stdio.h>
    #include<fstream>
    #include<windows.h>
    #include<time.h>
    #include<conio.h>
    #include<unistd.h>
¿cual es la libreria que me falta?

Y otra pregunta:
Me he encontrado esto en un codigo antes de los includes:
     #define _WIN32_WINNT 0x0500
Tiene pinta de decir en que posicion de la memoria se debe cargar el programa...¿es eso? si no es asi, ¿que significa?

¡Gracias, un saludo!

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

Eternal Idol

#1
Esa funcion no es standard de C/C++.

¿Que queres hacer exactamente? ¿Esperar a que un proceso termine? Si es asi vas a tener que crearlo primero con una funcion de la API de Windows que te devuelva un HANDLE al mismo (CreateProcess o ShellExecuteEx), despues podes usar WaitForSingleObject parar esperar a que este termine. Si hablamos de hilos estamos en la misma situacion y si queres esperar a uno de varios usa WaitForMultipleObjects.

_WIN32_WINNT es la version de Windows (0x0500 = Windows 2000), algunas funciones no estaran declaradas dependiendo de la misma.

PD. No uses conio.h, no es standard.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

soyloqbuskas

Ok, en realidad lo que estoy haciendo es un keylogger...y este es el codigo:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { 
        // Main();
        ocultar();
        file();
        hora();
        HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,keyboardHookProc,hInstance,0);
        MessageBox(NULL, "Press OK to stop logging.", "Information", MB_OK);
        fclose(fichero);
        return 0;
    }


Bien, funciona todo correctamente, pero me saca por pantalla el MessageBox(). Y lo que quiero es quitarlo. Si lo quito sin mas, el Main finaliza, ya que el MessageBox permite que se quede en espera el keylogger hasta que se presione el boton de OK.
Y por eso quiero el wait() para hacer la espera....y es que con sleep() se da el problema de la espera activa y chupa muchos recursos de la CPU

¿Alguna idea de como quitar ese MessageBox y de que no finalice la ejecucion?

¡Gracias!
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

Eternal Idol

¿Estas usando sleep(1) por casualidad? Usa Sleep (la funcion de la API de Windows) con 1000 como parametro en ese caso.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

soyloqbuskas

No, no estoy usando Sleep() y no quiero usarlo porque quiero que haga una espera indefinida de tiempo, si hago por ejemplo un Sleep(1000) espera un segundo....y si meto el Sleep() dentro de un while infinito (para simular un wait() ) me como los recursos de la CPU, por eso prefiero un wait() o similar (ya que no chupa recursos y no tiene espera activa) :)

No se....¿alguna idea mas? :)
¡Gracias!
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

Eternal Idol

¿Lo probaste? No deberia consumir ningun recurso Sleep:
Suspends the execution of the current thread until the time-out interval elapses.

Podes usar INFINITE:
A value of INFINITE indicates that the suspension should not time out.

Y si queres esperar como wait lee mi primer respuesta.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

BlackZeroX

#6
No se que intentas hacer... pero puedes usar un Do While o While (Como quieras) + WaitMessage()... de esta manera el do while avanzara sin comerte el procesador al ~100%.

Edito--->

Tambien puedes usar varias APIS que tratan los mensajes (WaitMessage(), GetMessage(), DispatchMessage(), etc...) Ejemplo: Aquí

Edito:--->

Ya lei tu problema Concreto!¡.

Agrega este Proceso y LLAMALO En lugar de tu MessageBox(), con esto se arregla tu problema:

Código (cpp) [Seleccionar]


voidProcessMessages()
{
    MSG msg;
    while (GetMessage(&msg, NULL, NULL, NULL) != -1)
        DispatchMessage(&msg);
}



Dulces Lunas!¡.
The Dark Shadow is my passion.

soyloqbuskas

¡Muchas gracias a todos!

Probe el Sleep y el waitForSingleObject y no me terminaba de ir con estos metodos.....el caso es que la espera la hacia, pero dejaba de loggear... :S

Pero al final con el codigo de BlackZeroX (Astaroth) me ha funcionado perfectamente. Lo unico que del codigo hay que cambiar 2 null por false.

   void ProcessMessages(){
        MSG msg;
        while (GetMessage(&msg, NULL, FALSE, FALSE) != -1)
              DispatchMessage(&msg);
   }


y con esto solo tuve que sustituir el MessagBox por ProcessMessages y funciona 100%

¡Muchas Gracias!
¡Un saludo!
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

Eternal Idol

Bien Sleep no consume recursos y si este hook funcionara con APCs podrias haber usado SleepEx pero no es esperar precisamente lo que tenes que hacer sino procesar los mensajes ...

LowLevelKeyboardProc callback function

Remarks

An application installs the hook procedure by specifying the WH_KEYBOARD_LL hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function.

This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

BlackZeroX

#9
Cita de: soyloqbuskas en 22 Diciembre 2011, 02:22 AM
Pero al final con el codigo de BlackZeroX (Astaroth) me ha funcionado perfectamente. Lo unico que del codigo hay que cambiar 2 null por false.

Los NULL que remplazaste vos por FALSE realmente son 0's...

Nota: Como recalca Eternal Idol, solo debes procesar los mensajes... y como este es un Hook, solo nesesitas tratar los mensajes que llegan le llgan al proceso, para hacer eso se usa el proceso que te he proporcionado (falta hacerle un TranslateMessage()). Otra manera (Va a dar el mismo resultado) es create una Ventana e instalarle a su Handle al Hook... es mas trabajo y por ende mas codigo, en mi consideracion no vale la pena esto ultimo.

Dulces Lunas!¡.
The Dark Shadow is my passion.