Enlace De Teclado
por Arkon
Una DLL es una indirecta ejecutable que no tiene un bucle de mensaje para recibir la entrada del usuario. Los archivos dll son archivos separados que contienen funciones(no sólo) que pueden ser llamados por programas y otros archivos Dll. Para el usuario final de un archivo DLL es un programa que no puede ser ejecutado directamente desde el Programa Pesebre(o de otros Shells), pero desde el punto de vista del sistema, existen dos diferencias entre archivos Dll y aplicaciones: archivos Dll que no pueden tener varias instancias en ejecución cargado en memoria. y Dll se adhieren a los procesos, sólo la aplicación de instancias de procesos. DLL representa una Librería de Enlace Dinámico. Dynamic-Link es un mecanismo para bibliotecas de vínculos a las aplicaciones en tiempo de ejecución. Estas bibliotecas(Dll) residir en sus propios archivos ejecutables(.dll) y no se copian en las aplicaciones de " archivos ejecutables(.exe) como con la electricidad Estática de las bibliotecas de vínculos. Es importante entender que una .Archivo DLL se carga en el espacio de dirección de la vinculación de la aplicación y no en el montón global! Las ventajas de la utilización de la vinculación dinámica del método son:
Se puede actualizar sin necesidad de que las aplicaciones se vuelve a compilar o vincular.
Cuando varias aplicaciones de uso de la misma .DLL, el .Archivo DLL se acaba de cargar de una vez por todas las aplicaciones(reducción de la memoria y espacio en disco).
La razón por la que necesitamos un archivo DLL para un enlace de todo el Sistema es porque queremos que la Función de Filtro para estar en cualquier aplicación de espacio de direcciones. Así que cuando se establece el enlace del mensaje función del filtro que se encuentra en el .dll Windows asigna la .dll automáticamente en todas las aplicaciones de espacio de direcciones. De este modo se obtiene de la función de filtro llamado para cada proceso! Por lo tanto, cuando nos vinculación dinámica en el gancho que se encuentra en una .DLL que se convierte en un enlace de todo el Sistema(por supuesto depende del tipo de Función de Filtro demasiado). Bien, ahora, después de la importante material teórico..
Vamos a empezar la codificación de la .DLL para todo el Sistema de enlace de teclado y, a continuación, voy a explicar cómo la vinculación dinámica en el .DLL dentro de nuestra aplicación.
Por favor, descargue el código fuente para ver cómo está todo escrito y hecho.
// Este es nuestro teclado de devolución de llamada proc:
// _declspec(dllexport) significa que queremos que otras
// aplicaciones/archivos Dll llamar a esta función, en los mismos casos que no
// necesidad de este prefijo, pero por seguridad vamos a utilizar.
_declspec(dllexport) LRESULT CALLBACK KBHookProc(int Código,
WPARAM wParam, LPARAM lParam)
{
// Si el código es menor que 0 llamamos el enlace siguiente,
// esta es la forma en ganchos de trabajo, nada especial
si (Código < 0) return(CallNextHookEx(hhook, Código, wParam, lParam));
// Info acerca de lo que sucede con el teclado
si (lParam & (1 << 31)) // 31 Bits indica si una tecla es presionada
// Llamar a la siguiente gancho.
retorno(CallNextHookEx(hhook, Código, wParam, lParam));
}
// Este es el mismo como WinMain/Principal, pero para archivos Dll,
// obtener el archivo DLL instancia, la Razón de cómo tu .DLL reservados.
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason,
LPVOID lpReserved)
{
// En realidad hay 4 razones, vamos a procesar solo 2 de ellos,
// porque es suficiente para nuestro prog.
si (dwReason == DLL_PROCESS_ATTACH) // Carga el .DLL
{
si(pcount == 0)
{
// Init // Primer tiempo de carga
// Conjunto de gancho.
}
pcount++;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
// UnInit antes de que el sistema libera el .DLL de la memoria.
si(pcount == 1)
{
// Libre
// Matar gancho.
}
pcount--;
}
return(1);
}
Se puede ver, es bastante fácil, diría yo. De todos modos, pcount es nuestro proceso de contador, dice cuántas veces .DLL que se ha llamado. pcount es una variable especial, tiene que estar en el montón global, porque si no, a continuación, cada vez que la nuestra .DLL va a ser inicializado a 0 de nuevo y de nuevo...así que para evitar eso, le decimos al compilador que poner la variable en el montón global. Hacemos esto para que el gancho de manejar, ya que establecer el enlace sólo una vez. Si ponemos el gancho cada vez que la .DLL que se llama, va a ser un mal estado de gancho y que no funcionan correctamente y como queremos! Para indicar al compilador que queremos es poner la variable en el montón global hacemos esto:
#pragma data_seg("SharedBlock")
HHOOK hhook = NULL;
int pcount = 0;
#pragma data_seg()
Aviso cada variable tiene que ser inicializado. ok vamos a HHOOK hhook = NULL; unsigned long pulsaciones de tecla = 0; int pcount = 0; #pragma data_seg() pronto Nos terminado de escribir .DLL, cada .Archivo DLL tiene que tener una .DEF archivo para dirigir el compilador. En el .DEF archivo, le decimos al compilador de las funciones que queremos exportar, sí, esas con el _declspec(dllexport), y le decimos al compilador sobre los datos compartidos bloque. (Ver el código fuente para una plena comprensión de la .Archivo DEF). Una vez que el .Archivo DLL está listo, usted tiene que copiar a la aplicación que carga el .Directorio DLL o copiarlo a la carpeta %windir%\system.
OK, eso es todo por el .DLL cosas, ahora vamos a cargar el .DLL que hemos creado! En primer lugar tenemos que declarar punteros a funciones con los parámetros que reciben.
typedef void (*LPFunction)(void);
LPFunction función = NULL;
// Esto es un puntero a una función que no tiene
// parámetros y que devuelve un vacío.
HMODULE DLLmodule = LoadLibrary("mydll.dll");
si (!DLLmodule) // .Archivo DLL no encontrado!
// Esta función se obtiene el código de la específica quería función de la memoria,
// Aviso de las letras mayúsculas, el querido nombre de la función es exactamente,
// como en el .Archivo DEF y .Archivo CPP de la DLL escribimos.
la función = (LPFucntion)GetProcAddress(DLLmodule, "Función");
si (!función) // implementación de la Función de código no se encuentra!
// Ahora usted puede llamar a la función.
la función();
// Después de terminar de usar el .DLL, no se olvide de sacarlo!
FreeLibrary(DLLmodule);
Woohoo, que es!! Bueno, esto era solo el basico y no va a funcionar si usted copiar y pegar.
Fecha de publicación: