Beruflich Dokumente
Kultur Dokumente
Facultad de Ingeniera
Escuela de Ingeniera Elctrica
Por:
Luis Alfonso Castro Leiva
_________________________________
Ing. Rodrigo Garca Len
Profesor Gua
_________________________________
Ing. Lucky Lochi Yu Lo
Profesor lector
_________________________________
Ing. Teodoro Willink Castro
Profesor lector
ii
DEDICATORIA
A Dios,
A mi familia y amigos,
que me han acompaado
en el largo camino
iii
RECONOCIMIENTOS
Un reconocimiento especial a mis padres por su gran ayuda durante toda mi vida.
iv
NDICE GENERAL
Introduccin ................................................................................................................ 1
1.2
Justificacin ................................................................................................................ 2
1.3
1.4
Objetivos ..................................................................................................................... 4
1.1.1
1.1.2
1.5
Metodologa ................................................................................................................ 5
Caractersticas Globales..................................................................................... 6
2.1.2
Caractersticas locales........................................................................................ 8
2.2
2.3
2.4
2.5
El Software WampServer.........................................................................................13
2.5.1
2.5.2
2.5.3
2.6
2.7
AJAX.........................................................................................................................15
3.2
3.3
3.4
3.5
4.2
Conclusiones.............................................................................................................37
6.2
Recomendaciones .....................................................................................................38
BIBLIOGRAFA............................................................................................... 40
APNDICE A: Cdigo del cliente de comunicacin con el lector de
huellas dactilares. .............................................................................................. 41
A.1.
A.2.
A.3.
A.4.
A.5.
Archivo enroll.h........................................................................................................58
A.6.
Archivo enroll.cpp....................................................................................................66
B.2.
Archivo ajax.js..........................................................................................................75
B.3.
Archivo query_name.php.........................................................................................77
B.4.
B.5.
B.6.
Archivo query_cedula.php.......................................................................................80
B.7.
B.8.
Archivo query_eliminar.php....................................................................................82
Funciones de extraccin...................................................................................89
2.7.2
ANEXOS............................................................................................................. 93
vii
NDICE DE FIGURAS
viii
NOMENCLATURA
IDE
SDK
API
HTTP
PHP
GPL
AJAX
RAD
MingW
GCC
ix
RESUMEN
CAPTULO 1: Introduccin
1.1
Introduccin
Cuando los seres humanos interactan con otras personas, la identificacin se
realiza por caractersticas como su apariencia fsica. En caso de que una prueba de la
identidad de la persona sea requerida, se recurre a algn tipo de tarjeta de identificacin,
como la cdula de identidad, el pasaporte o incluso la firma. Sin embargo, tcnicas de
identificacin pueden ser fcilmente falsificables. Por este motivo se desarroll la
biometra, ciencia que estudia la identificacin de personas por medio de caractersticas
anatmicas. La gran ventaja de la identificacin biomtrica radica en que las caractersticas
analizadas son prcticamente irrepetibles en diferentes seres humanos y la falsificacin de
las mismas es extremadamente difcil.
Por este motivo, el desarrollo de soluciones biomtricas en el rea digital ha tenido
un enorme desarrollo, especialmente en la identificacin mediante huellas dactilares, palma
de la mano y el iris. Esto trae consigo grandes ventajas en especial en el rea de control de
acceso y seguridad en empresas e instituciones, adems del control de asistencia de
personal.
1.2
Justificacin
Cuando una empresa es de gran tamao y sus empleados son muchos, la prdida de
1.3
1.4
Objetivos
1.1.1
Objetivo general
1.1.2
Objetivos especficos
Realizar un estudio acerca de las tecnologas existentes en la identificacin de
personas mediante huella dactilar.
1.5
Metodologa
Principios
de
reconocimiento
biomtrico
mediante
huellas
dactilares
Los dedos tienen superficies rugosas que permiten a los seres humanos tener ms
friccin para tomar objetos y sostenerse de superficies sin deslizamientos. Estas
rugosidades forman patrones que son prcticamente nicos e irrepetibles en los seres
humanos. La identificacin de personas se realiza por medio de dos caractersticas en estos
patrones: caractersticas globales y caractersticas locales.
Las caractersticas globales en las huellas dactilares son aquellas que se pueden
observar a simple vista, mientras que las caractersticas locales son llamadas puntos de
minutia. El arreglo bidimensional de la posicin de los puntos de minutia es utilizado en los
algoritmos de reconocimiento debido a que diferentes personas pueden tener caractersticas
globales similares, mientras que es muy poco probable que dos personas tengan arreglos de
puntos de minutia similares, adems de tener la ventaja de que un patrn de este tipo puede
ser cuantificable, lo cual hace esta tcnica candidata ideal para ser implementada de forma
digital.
2.1.1
Caractersticas Globales
Algunos tipos de caractersticas globales son el rea patrn, la delta y el patrn
bsico, aunque existen muchas otras que ayudan a la clasificacin manual de las huellas
digitales. El rea patrn es el rea principal donde se incluyen la mayora de las
caractersticas globales, un ejemplo de esta rea se muestra en la figura 2.1.
2.1.2
Caractersticas locales.
Las lneas que conforman una huella digital no son continuas ni rectas, stas
Fin de lnea
Isla o punto. Es una lnea que empieza y acaba en un trayecto muy corto.
2.2
trabajo, el cual fue escogido por ser la herramienta de software que permite el desarrollo de
aplicaciones con el lector de huellas seleccionado despus del estudio de tecnologas y
posibilidad de implementacin en el trabajo.
El paquete de desarrollo de software SDK, One Touch para Windows C/C++
Edition, versin 1.4, es el paquete que contiene todos los elementos necesarios para el
desarrollo de una aplicacin que interacte con los lectores de huellas digitales de
DigitalPersona, incluida la interfaz de programacin de aplicaciones o API, las libreras
estticas y dinmicas requeridas para comunicarse con el hardware desde un nivel de
abstraccin ms alto (como lo es el lenguaje C++) y los controladores requeridos por el
sistema operativo para el control del hardware. La instalacin de este paquete se encuentra
explicada detalladamente en la gua del desarrollador incluida en el mismo paquete, y es en
este mismo documento donde se explica el manejo de las funciones del API y su adecuado
uso.
2.3
El API de DigitalPersona.
La interfaz de programacin de aplicaciones de DigitalPersona es la que realmente
Para hacer uso del API se deben agregar libreras estticas en el linker del
compilador a utilizar, para que las llamadas a estas libreras que se encuentran en los
archivos de encabezado, que tambin deben ser agregados, sean comprendidas por el
compilador
El API se encuentra dividido en dos: el ncleo y un encapsulamiento que crea una
interfaz de usuario del API. Este encapsulamiento (wrapper) consiste en dos funciones
DPEnrollUI y DPVerifyUI. Estas dos funciones son usadas para crear una plantilla con
informacin sobre la huella digital y realizar una verificacin de una huella contra una
plantilla existente. Adems, el encapsulamiento incluye una enumeracin utilizada en las
dos funciones y dos funciones callback. Una funcin callback consiste en un cdigo
ejecutable que es pasado como argumento a otro cdigo, esto permite a una capa inferior de
software llamar una subrutina definida en una capa superior.
Dependiendo del tipo de aplicacin, puede resultar ms fcil hacer uso de este
encapsulamiento. En soluciones como la elaborada en este proyecto no es ese el caso
debido a que se desea tener un alto grado de control sobre el funcionamiento del lector de
huellas digitales, en especial para la comparacin. En la comparacin se debe realizar esta
operacin interactuando con todo un conjunto de elementos presentes en la base de datos a
utilizar y adems tomar decisiones que dependen del tiempo, pues se deben registrar
entradas o salidas. Por este motivo el ncleo del API fue la herramienta utilizada.
10
11
2.4
Visual C++ 2005 es por esto que en este apartado se habla brevemente sobre l, y se
comentan los aspecto bsicos necesarios que se necesitan conocer. Este entorno de
desarrollo permite la rpida creacin de aplicaciones generando grandes cantidades de
cdigo de forma que libera trabajo al programador y le permite centrarse en las necesidades
particulares de su aplicacin. El punto ms importante de mencionar sobre este IDE es el
manejo de Common Language Runtime (CLR), el cual es el motor de la plataforma de
trabajo (Framework) .NET de Microsoft. Esta plataforma es la responsable de acelerar y
simplificar la creacin y el manejo de formularios con los cuales se desarrollan aplicaciones
para Windows. Esto es una gran ventaja pero a la vez genera un problema con el uso del
API de DigitalPersona. Este API est desarrollo en cdigo de C++ estndar, o como lo
llaman en la plataforma de desarrollo .Net, cdigo no manejado o nativo. El cdigo CLR es
llamado cdigo manejado y tiene grandes dificultades con la interaccin de cdigo no
manejado, especialmente por el uso de un componente de Visual C++ 2005, llamado el
recolector de basura (Garbage Collector), este bloque genera dificultades en especial con el
manejo de punteros y pasos por referencia del cdigo nativo. Esto obliga a recurrir a
estrategias que han sido desarrolladas para tal fin como colocar pines a los punteros. Estos
pines fijan los punteros en direcciones de memoria de forma tal que el colector de basura no
generar problemas con el cdigo nativo.
12
2.5
El Software WampServer.
Para implementar la parte Web del proyecto de requiere una estructura que d
proyectos, entre ellos se encuentra el servidor HTTP Apache. Este proyecto busca el
desarrollo y mantenimiento de un servidor HTTP para sistemas operativos modernos como
UNIX y Windows NT. El objetivo del proyecto es proveer de una alternativa de servidor,
segura, eficiente y extensible que est acorde con los estndares de HTTP.
A travs de la interfaz de WampServer se puede iniciar y detener Apache Server, e
incluso cambiar algunas de sus caractersticas, pero para una configuracin ms profunda
se puede modificar el archivo de configuracin de Apache, httpd.conf y manejarlo desde
lnea de comandos.
13
2.5.2
tambin es posible comprar una versin licenciada. MySQL permite estructurar bases de
datos y realizar consultas a travs de lenguaje SQL
2.5.3
El interpretador PHP
PHP es un lenguaje interpretado, por lo cual se requiere un programa interpretador
que convierta el cdigo a lenguaje mquina cada vez que se desea ejecutar. Esto trae
consigo una problemtica para las aplicaciones Web: que el cdigo debe ser ejecutado del
lado del servidor, en el caso de que el cdigo PHP deba ser ejecutado solo bajo ciertas
condiciones o con ciertos parmetros acrecenta la problemtica, por la necesidad de una
comunicacin asincrnica entre cliente y servidor. Para solucionar este problema se ha
desarrollado AJAX.
Se ha decidido utilizar PHP por la enorme facilidad que tiene para establecer
comunicacin con MySQL a travs de un API para tal fin. Este API ya se encuentra
incluido y configurado dentro del paquete WampServer lo cual facilita en gran medida el
trabajo.
2.6
El API C de MySQL
Se debe comentar tambin sobre la estructura que da soporte a la base de datos y la
mejor opcin para esto es MySQL por esto se dedica un apartado para hablar sobre el API
de MySQL, pues es la herramienta de conexin entre el software y la base de datos usada.
14
mysql_real_connect(connection,host,username,password,dat
abase,port, NULL,0): establece la conexin con la base de datos.
2.7
AJAX
AJAX no es una tecnologa, es un conglomerado de tecnologas existentes que ha
permitido lograr grandes avances en el mundo del Internet. La idea detrs de AJAX es
evitar la necesidad de tener que estar cargando una pgina Web cada vez que el usuario
interacta con ella y se deben generar cambios. Una vez cargada y renderizada la pgina,
AJAX permite una comunicacin asincrnica con el servidor, para traer datos que sern
usados solo en una nueva re-renderizacin del sitio, evitando la necesidad de tener que
15
cargar toda la pgina. El mejor ejemplo que se puede dar del uso de AJAX es Google
Maps, donde es claro como es posible dar zoom y ver diferentes puntos de todo el mapa sin
la necesidad de refrescar la pgina. Esto no es de extraar pues Google ha sido uno de los
ms fuertes impulsores de AJAX.
AJAX es realmente muchas tecnologas, cada una floreciendo por su propio
mrito, unindose en poderosas nuevas formas. AJAX incorpora:
se puede ver claramente las enormes ventajas de AJAX respecto a las nuevas posibilidades
que brinda.
16
17
18
antiguas que la que se comercializa en este momento, lo cual permiti el desarrollo del
proyecto a un bajo costo. El contra que posea la eleccin de este dispositivo fue su
disponibilidad, aunque DigitalPersona tiene un socio comercial en Costa Rica, este ya no
comercializa sus productos por lo que tuvo que importarse desde los Estados Unidos, con
todas las implicaciones que esto conlleva. La hoja de datos del U.are.U 4500 se encuentra
en el Apndice A de este documento.
3.2
19
trat de utilizar las herramientas orientadas para Linux. A pesar de los intentos de utilizar
los paquetes de desarrollo para Linux, esto no se pudo concretar debido a que a pesar de
haberse logrado actualizar el cdigo fuente de los manejadores de hardware cambiando
funciones obsoleta que se encontraban en los mismos, estos controladores solo funcionan
para modelos de lectores de huellas digitales iguales o anteriores al U.are.U 4000B, que es
anterior al U.are.U 4500 adquirido. Debido a esto se debi utilizar el paquete de desarrollo
para Windows XP, el cual contiene manejadores de hardware actualizados para el U.are.U
4500.
Fuera de los motivos tcnicos, otro fuerte motivo es el mercado meta del software
desarrollado. Este posiblemente utilice Windows a pesar del fuerte crecimiento que han
venido experimentando el uso de Linux en Costa Rica.
3.3
3.4
la misma sigue una concepcin modular por lo que est organizada en cuatro bloques
principales:
Un servidor MySQL y una base de datos que cuenta con las tablas y columnas
especficas de la aplicacin CRB.
21
Y por ltimo la interfaz Web por la cual el usuario tiene acceso a la informacin de
la base de datos.
APACHE y
PHP
Base de Datos
MySQL
Cliente de
comunicacin
con el lector
de huellas
Interfaz Web
Usuario
22
3.5
Debido a que el sistema desarrollado todava es una versin alfa, se decidi incluir dentro
de la base de datos la informacin bsica que puede necesitar una empresa. As la base de
datos, llamada crb_db1, incluye un tabla principal llamada empleados y una tabla por cada
empleado que lleva como nombre el nmero de cdula correspondiente a cada empleado.
Dentro de la tabla empleados se han creado las siguientes columnas:
23
BLOB. Por ltimo, el espacio cbData contiene la longitud recomendada para la plantilla de
huella dactilar, este valor es generado por una de las funciones del API de DigitalPersona y
debe ser usado cuando se lee la plantilla, es por esto que fue almacenado en la base de
datos. La sentencia SQL para la generacin de la tabla se encuentra en el apndice C.
24
25
Los dos modos de operacin antes mencionados son el modo de registro de control
de acceso (ver figura 4.6) y el modo de registro de nuevo personal (ver figura 4.2).
Solamente se puede tener uno de ellos activo en un momento dado, esto para independizar
ambos procesos. As el usuario percibe ms fcilmente lo que est haciendo y adems se
facilita la labor de programacin, pues se independizan las tareas de almacenamiento de
plantillas de huellas dactilares y la comparacin de plantillas almacenadas.
Desde el punto de vista de programacin existen 3 clases, una para cada formulario:
la clase Form1 para la ventana principal, la clase Verform para el registro de marcas y la
clase enrrol para el registro de personal nuevo. Adems el programa inicia con la ejecucin
de CRB.cpp, que es el archivo principal donde se inicializa el U.are.U 4500, se establece la
conexin con la base de datos crb_db1 y se llama a la ventana principal. En la figura 4.3 se
muestra el diagrama de flujo que sigue el CRB.cpp.
26
Inicio
Error
Inicializar el
hardware.
DPFPInit
Exitoso
Error
Crear un
contexto de
extraccin
FX_init
Exitoso
Crear un
contexto de
comparacin
MC_init
Error
Exitoso
Establecer conexin con MySQL
mysql_real_connect.
Abrir la ventana principal
Continuar con la ejecucin desde ah
Return 0
En general el programa puede ser analizado desde sus diferentes niveles de abstraccin,
(ver figura 4.4), este enfoque permite identificar donde estn los problemas, si son a nivel
de cdigo del programa, a nivel de dependencias de la funciones (encabezados) o a nivel de
libreras dinmicas (problemas en el linker).
4.1
lneas de texto sobre el estado actual, espacios para introducir informacin necesaria para el
registro de personal nuevo y dos botones: uno para guardar la informacin y otro para salir
del modo de registro de nuevo personal. La figura 4.1 muestra esta ventana. Es aqu donde
se debe almacenar la informacin sobre la huella digital de la persona en una plantilla. Este
proceso tiene la secuencia que se muestra en la figura 4.5, despus de haberse creado los
contextos de extraccin y comparacin requeridos por el API de DigitalPersona.
28
Existen suficientes
plantillas de pre-registro?
No
Si
Guardar las caractersticas en una plantilla definitiva y
almacenar la informacin en forma externa al programa
4.2
las marcas de entrada o salida a la empresa. La ventana de este modo aparece en la figura
29
4.6. La misma posee tres lneas de informacin, donde se puede ver si el lector de huellas
digitales se encuentra conectado o no, si la marca fue realizada exitosamente y si es posible
realizar marca en el presente momento.
30
31
query_name
query_apellido1
Cdigo
HTML
cliente.php
query_apellido2
Cdigo
JavaScript
ajax.js
query_cedula
Base de
datos
crb_db1
query_marcas
query_eliminar
32
que pueda comunicarse adecuadamente con los otros mdulos. Una vez recibido el
navegador Web lo procesar y se mostrar un resultado como el de la figura 3.2.
tipo de bsqueda se vaya a realizar. Es por esto que existen cuatro bloques query_,
correspondientes a cada una de las bsquedas. Los bloques query_ sea query_name,
query_apellido1, query_apellido2 o query_cedula, son ejecutados del lado del servidor,
debido a que estn escritos en PHP y requieren del interpretador. Una vez procesados, stos
devuelven la informacin mediante la sentencia echo de PHP y son mostrados como se ve
en la figura 3.3. Es importante decir que para versiones posteriores del sistema CRB debe
buscarse otra forma de enviar informacin de regreso a cdigo en JavaScript.
Posteriormente la funcin Consulta se encarga de colocar los resultados en el cdigo
HTML y decirle al navegador Web que debe re-renderizar la pgina.
34
versin alfa, pero en versiones posteriores debe ser agregada tambin en la aplicacin de
escritorio mediante cdigo C++. Se ha agregado aqu principalmente porque la interfaz
Web puede ser accesada prcticamente desde cualquier lugar del mundo y no requiere de
una presencia fsica en el sitio de trabajo, como s sucede con la aplicacin de escritorio. En
lo que a programacin se refiere, se realiza a travs del bloque query_eliminar escrito en
PHP. Este bloque de cdigo difiere en que realiza dos consultas a la base de datos y no
solamente una, como es el caso de todo el resto de bloques query_, pues se debe eliminar
tanto la tabla codificada con el nmero de cdula de la persona como la fila respectiva en la
tabla empleados. Como resultado este enviar solamente una lnea de texto indicando que la
operacin fue realiza con xito, y el cdigo ajax.js en JavaScript se encarga de que la
pgina sea re-renderizada y mostrar un resultado como el que se aprecia en la figura 3.5.
El manejo del sistema, en su totalidad por parte del usuario final est documentado
en el manual del usuario.Este manual se encuentra en el Anexo de este documento.
36
Conclusiones
Una bsqueda concienzuda y comparativa fue la que permiti realizar una eleccin
37
6.2
Recomendaciones
La aplicacin desarrollada tiene mucho trabajo por delante antes de poder ser un
versin candidata a definitiva, entre los puntos en los que se debe trabajar para mejor el
sistema CRB se encuentran los siguientes.
Incluir la informacin de las plantillas de huella digital correspondiente a cada
persona dentro de la base de datos como un elemento tipo BLOB pues mejora en gran
medida la portabilidad y adems facilita enormemente la tarea de respaldar la informacin.
38
Buscar una mejor forma de enviar los resultados de la bsqueda en la base de datos
del cdigo PHP a la interfaz Web para presentar la informacin de forma ms
agradable.
Tomar en cuenta todos los posibles fallos del usuario en el ingreso de informacin.
En nmero de cdula, por ejemplo, se debe tomar medidas en caso de que el usuario
del programa no d el nmero completo o incluya letras o espacios dentro de la caja
de texto establecida para ingresar tal nmero.
Debido a que la solucin elaborada representa una versin alfa, el manual del
usuario elaborado deben ser puesto bajo revisin pues apenas cuentan con la
informacin necesaria para explicar al usuario como manejarse en el sistema pero
no prevn los problemas de desarrollo que hayan sido pasados por alto o que
todava no son del conocimiento del desarrollador del sistema CRB.
39
BIBLIOGRAFA
Artculos de revistas:
1. Jimnez, J.M. Marn J.G. Sistema de reconocimiento de huellas dactilares,
Mundo Electrnico, Espaa, N 380, 2006.
2. Zucker, D.F. What does AJAX mean for you?, Interactions, Estados Unidos,
Volumen 14 N 5, 2007.
Libros:
3. DigitalPersona, Inc.. One Touch for Window SDK C/C++ Edition. Developer
Guide, Estados Unidos, 2009.
4. Deitel, H.M. Deitel, P.J. C++ Cmo programar Segunda edicin, Prentice Hall,
Mxico, 1999.
Pginas Web:
5. PHP Manual, http://www.php.net/manual/en/
6. Versin 2.2 de la documentacin del Servidor de HTTP Apache,
http://httpd.apache.org/docs/2.2/
7. Garretr,
J.J.
AJAX:
New
Approach
to
http://adaptivepath.com/ideas/essays/archives/000385.php.
40
Web
Application,
A61368
Resumen: CRB.cpp
Este archivo contiene el arranque de CRB, se llama la base de datos
se inicializa el lector U.are.U 4500 y se llama la ventana principal
en caso de error se da aviso y se cierra el programa.
******************************************************************/
#include "stdafx.h"
#include "Form1.h"
#include "enrrol.h"
//Encabezados necesarios para la conexion la base de datos de MySQL
#include <Winsock.h>
#include <mysql.h>
using namespace CRB;
#define
#define
#define
#define
host "localhost"
username "admin"
password "crb"
database "crb_db1"
[STAThreadAttribute]
int main(array<System::String ^> ^args){
//Localiza e inicializa los recursos necesarios para el funcionamiento
del API
if(FAILED(DPFPInit())==TRUE);
else{
// Inicializa el mdulo de extraccin del SDK
if (FT_OK == FX_init())
{
// Inicializa el mdulo de comparacin del SDK
if (FT_OK == MC_init())
{
41
42
A61368
Resumen: Form1.h
Este archivo contiene tanto la declaracin como el contenido de las
funciones de la ventana principal, la cual se encarga de llamar los
dos diferentes modos de operacin y distribuir informacin de
conexin a MySQL.
******************************************************************/
#pragma once
//Encabezados de los modos de operacin
#include "enrrol.h"
#include "Verform.h"
//Encabezados necesarios para la conexion la base de datos de MySQL
#include <Winsock.h>
#include <mysql.h>
//Encabezados para la manipulacion de caracteres
#include <iostream>
#include <fstream>
namespace CRB {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::IO;
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(MYSQL* connlink)
{
InitializeComponent();
ZeroMemory(&m_RegTemplate, sizeof(m_RegTemplate));
conn = connlink;
}
protected:
~Form1()
43
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::MenuStrip^ menuStrip1;
private: System::Windows::Forms::ToolStripMenuItem^
archivoToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^
salirToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^
toolStripMenuItem1;
private: System::Windows::Forms::ToolStripMenuItem^
cRBToolStripMenuItem;
private: System::Windows::Forms::Button^ button2;
private: System::ComponentModel::IContainer^ components;
private:
DATA_BLOB
MYSQL*
m_RegTemplate;
conn;
44
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(184, 26);
this->button1->TabIndex = 0;
this->button1->Text = L"Registrar nuevo personal";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this,
&Form1::button1_Click);
//
// menuStrip1
//
this->menuStrip1->Items->AddRange(gcnew cli::array<
System::Windows::Forms::ToolStripItem^ >(2) {this>archivoToolStripMenuItem,
this->toolStripMenuItem1});
this->menuStrip1->Location = System::Drawing::Point(0, 0);
this->menuStrip1->Name = L"menuStrip1";
this->menuStrip1->Size = System::Drawing::Size(292, 24);
this->menuStrip1->TabIndex = 1;
this->menuStrip1->Text = L"menuStrip1";
//
// archivoToolStripMenuItem
//
this->archivoToolStripMenuItem->DropDownItems->AddRange(gcnew
cli::array< System::Windows::Forms::ToolStripItem^ >(1) {this>salirToolStripMenuItem});
this->archivoToolStripMenuItem->Name =
L"archivoToolStripMenuItem";
this->archivoToolStripMenuItem->Size =
System::Drawing::Size(55, 20);
this->archivoToolStripMenuItem->Text = L"Archivo";
//
// salirToolStripMenuItem
//
this->salirToolStripMenuItem->Name =
L"salirToolStripMenuItem";
this->salirToolStripMenuItem->Size =
System::Drawing::Size(105, 22);
this->salirToolStripMenuItem->Text = L"Salir";
this->salirToolStripMenuItem->Click += gcnew
System::EventHandler(this, &Form1::salirToolStripMenuItem_Click);
//
// toolStripMenuItem1
//
this->toolStripMenuItem1->DropDownItems->AddRange(gcnew
cli::array< System::Windows::Forms::ToolStripItem^ >(1) {this>cRBToolStripMenuItem});
this->toolStripMenuItem1->Name = L"toolStripMenuItem1";
this->toolStripMenuItem1->Size = System::Drawing::Size(67,
20);
this->toolStripMenuItem1->Text = L"Acerca de";
//
// cRBToolStripMenuItem
45
//
this->cRBToolStripMenuItem->Name = L"cRBToolStripMenuItem";
this->cRBToolStripMenuItem->Size = System::Drawing::Size(105,
22);
this->cRBToolStripMenuItem->Text = L"CRB";
this->cRBToolStripMenuItem->Click += gcnew
System::EventHandler(this, &Form1::cRBToolStripMenuItem_Click);
//
// button2
//
this->button2->Location = System::Drawing::Point(53, 141);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(184, 26);
this->button2->TabIndex = 2;
this->button2->Text = L"Registrar marcas de personal";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this,
&Form1::button2_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode =
System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 266);
this->Controls->Add(this->button2);
this->Controls->Add(this->button1);
this->Controls->Add(this->menuStrip1);
this->Icon = (cli::safe_cast<System::Drawing::Icon^
>(resources->GetObject(L"$this.Icon")));
this->MaximizeBox = false;
this->MaximumSize = System::Drawing::Size(300, 300);
this->MinimumSize = System::Drawing::Size(300, 300);
this->Name = L"Form1";
this->StartPosition =
System::Windows::Forms::FormStartPosition::CenterScreen;
this->Text = L"Control de Registro Biometrico";
this->menuStrip1->ResumeLayout(false);
this->menuStrip1->PerformLayout();
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
private: System::Void button1_Click(System::Object^
System::EventArgs^ e) {
this->Hide();
enrrol ^form2 = gcnew enrrol();
form2->GetConnetionLinker(conn);
form2->ShowDialog(this);
this->Show();
46
sender,
}
private: System::Void button2_Click(System::Object^ sender,
System::EventArgs^ e) {
this->Hide();
Verform ^form3 = gcnew Verform();
form3->GetConnetionLinker(conn);
form3->ShowDialog(this);
this->Show();
}
private: System::Void salirToolStripMenuItem_Click(System::Object^
sender, System::EventArgs^ e) {
if(MessageBox::Show( "Desea salir de la aplicacin?",
"Salir", MessageBoxButtons::YesNo ) ==
System::Windows::Forms::DialogResult::Yes)
Application::Exit();
}
private: System::Void cRBToolStripMenuItem_Click(System::Object^
sender, System::EventArgs^ e) {
MessageBox::Show( "CRB: Control de Registro
Biomtrico\n2009\nElaborado por: Luis Castro Leiva", "Acerca de CRB");
}
};
}
A61368
Resumen: Verform.h
Este archivo contiene declaraciones de las funciones que correponden
a la ventana de registro de control de acceso, (ver Verform.cpp)
y forma parte del cliente de comunicacion con el lector de huellas
digitales U.are.U 4500
******************************************************************/
#pragma once
#pragma warning( disable : 4368)
#include "dpRCodes.h"
#include "dpDefs.h"
#include "DPDevClt.h"
47
#include "dpFtrEx.h"
#include "dpMatch.h"
#include "DpUIApi.h"
//Encabezados necesarios para la manipulacion de caracteres
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
//Encabezados para la conexion con la base de datos
#include <Winsock.h>
#include <mysql.h>
using
using
using
using
using
using
using
using
using
using
namespace
namespace
namespace
namespace
namespace
namespace
namespace
namespace
namespace
namespace
std;
System;
System::ComponentModel;
System::Collections;
System::Windows::Forms;
System::Data;
System::Drawing;
System::Globalization;
System::IO;
System::Runtime::InteropServices;
namespace CRB {
public ref class Verform : public System::Windows::Forms::Form
{
public:
Verform(void){
InitializeComponent();
}
protected:
~Verform(){
if (components){
delete components;
}
delete [] m_RegTemplate.pbData;
m_RegTemplate.cbData = 0;
m_RegTemplate.pbData = NULL;
}
//codificacion para los eventos generados por el lector
private: static const UINT FP_EVENT = (WM_USER+1);
// Variables globales necesarias en el proceso de Verificacion
private:
// Contexto de extraccion
FT_HANDLE
m_fxContext;
// Contexto de comparacion
48
FT_HANDLE
m_mcContext;
// Handle de la operacion
HDPOPERATION
m_hOperationVerify;
// Objetos binarios donde se almacen las plantillas de huellas
dactilares
DATA_BLOB
m_RegTemplate,r_RegTemplate;
// identificador de la comunicacion establecidad con MySQL
MYSQL*
conn;
// Objeto para almacenar los resultados de una consulta a MySQL
MYSQL_RES*
mysql_res;
// Bandera de resultado de comparacion TRUE == huellas
concuerdan. FALSE == no concuerdan
bool
match_flag;
private:
private:
private:
private:
private:
System::Windows::Forms::Label^ label1;
System::Windows::Forms::Button^ button1;
System::Windows::Forms::Label^ label2;
System::Windows::Forms::Label^ label3;
System::Windows::Forms::GroupBox^ groupBox1;
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
System::ComponentModel::ComponentResourceManager^
resources
= (gcnew
System::ComponentModel::ComponentResourceManager(Verform::typeid));
this->label1 = (gcnew System::Windows::Forms::Label());
this->button1 = (gcnew System::Windows::Forms::Button());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label3 = (gcnew System::Windows::Forms::Label());
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
this->groupBox1->SuspendLayout();
this->SuspendLayout();
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(46, 54);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(35, 13);
this->label1->TabIndex = 0;
this->label1->Text = L"label1";
//
// button1
//
this->button1->Location = System::Drawing::Point(314, 255);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(92, 28);
this->button1->TabIndex = 1;
49
this->button1->Text = L"Cerrar";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this,
&Verform::button1_Click);
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(46, 89);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(35, 13);
this->label2->TabIndex = 2;
this->label2->Text = L"label2";
//
// label3
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(46, 125);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(35, 13);
this->label3->TabIndex = 3;
this->label3->Text = L"label3";
//
// groupBox1
//
this->groupBox1->Controls->Add(this->label2);
this->groupBox1->Controls->Add(this->label1);
this->groupBox1->Controls->Add(this->label3);
this->groupBox1->Location = System::Drawing::Point(12, 37);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(394, 212);
this->groupBox1->TabIndex = 5;
this->groupBox1->TabStop = false;
this->groupBox1->Text = L"Estado";
//
// Verform
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode =
System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(418, 295);
this->Controls->Add(this->groupBox1);
this->Controls->Add(this->button1);
this->Icon = (cli::safe_cast<System::Drawing::Icon^
>(resources->GetObject(L"$this.Icon")));
this->MaximizeBox = false;
this->MaximumSize = System::Drawing::Size(426, 329);
this->MinimumSize = System::Drawing::Size(426, 329);
this->Name = L"Verform";
this->StartPosition =
System::Windows::Forms::FormStartPosition::CenterScreen;
this->Text = L"Control de entradas y salidas";
50
51
A61368
Resumen: Verform.cpp
Este archivo contiene las funciones que correponden a
la ventana de registro de control de acceso, (ver Verform.h)
y forma parte del cliente de comunicacion con el lector de
huellas digitales U.are.U 4500
******************************************************************/
#include "StdAfx.h"
#include "Verform.h"
using namespace CRB;
System::Void Verform::GetConnetionLinker(MYSQL* connlink){
conn = connlink;
}
52
53
sender,
54
// Contexto para la
// Tamao de la
// Puntero a algun
// Requested
// Tamao del buffer
pVerTemplate,
donde se almacena la plantilla
&imgQuality,
calidad de la imagen
&ftrQuality,
calidad de las caracteristicas
&bEextractOK);
extraccin
// Puntero al buffer
// Retorna la
// Retorna la
// Resultado de la
55
// Contexto de
// puntero a
// tamao de
// tamao de
// Puntero a
// Obsoleto,
// Reservado,
// Reservado,
// Reservado,
//
// resultado
to run
pRegTemplate = NULL;
56
char*
MYSQL_ROW
sql;
row;
String^ solicitud =
String::Format(CultureInfo::CurrentCulture,"SELECT * FROM empleados");
sql = (char*)(void*)Marshal::StringToHGlobalAnsi(solicitud);
int len = 0;
len = strlen(sql);
if(!mysql_real_query(conn, sql ,len)){
this->label2->Text = L"Consulta exitosa";
}
else{
this->label2->Text = L"Error en la consulta";
}
mysql_res = mysql_store_result(conn);
int match_cedula = 0;
while (row = mysql_fetch_row(mysql_res)){
match_flag = false;
int iRecommendedRegFtrLen = atoi(row[6]);
char archivo[40];
strcpy_s(archivo,40,"d:\\CRB\\CRB\\Templates\\");
strcat_s(archivo,40,row[3]);
strcat_s(archivo,40,".crbt");
char* templ = new char[iRecommendedRegFtrLen];
ifstream input(archivo, ios::binary);
input.read(templ, iRecommendedRegFtrLen);
input.close();
//Borrar la informacion antigua del template
delete [] m_RegTemplate.pbData;
m_RegTemplate.pbData = NULL;
m_RegTemplate.cbData = 0;
// Se copian los datos suministrados dentro de la plantilla de
comparacion
m_RegTemplate.pbData = new BYTE[iRecommendedRegFtrLen];
if (!m_RegTemplate.pbData)
MessageBox::Show( "No hay una plantilla creada", "Error");
::CopyMemory(m_RegTemplate.pbData, templ, iRecommendedRegFtrLen);
m_RegTemplate.cbData = iRecommendedRegFtrLen;
Verificar(pFingerprintImage, iFingerprintImageSize);
if(match_flag == true)
match_cedula = atoi(row[3]);
}
mysql_free_result(mysql_res);
if(match_cedula != 0){
Marca_Personal(match_cedula);
57
this->label1->Text
this->label2->Text
exitosamente";
}
else{
this->label1->Text
this->label2->Text
}
}
System::Void Verform::Verform_FormClosing(System::Object^
System::Windows::Forms::FormClosingEventArgs^ e) {
if (m_hOperationVerify) {
DPFPStopAcquisition(m_hOperationVerify);
DPFPDestroyAcquisition(m_hOperationVerify);
m_hOperationVerify = 0;
}
if (m_fxContext) {
FX_closeContext(m_fxContext);
m_fxContext = 0;
}
if (m_mcContext) {
MC_closeContext(m_mcContext);
m_mcContext = 0;
}
}
sender,
/*****************************************************************
Universidad de Costa Rica
Escuela de Ingenieria Electrica
II Semestre 2009
IE-0502
Proyeto Electrico
Elaborado por: Luis Castro Leiva
A61368
Resumen: enrroll.cpp
Este archivo contiene las declaraciones funciones que correponden
a la ventana de registro de nuevo personal, (ver enrrol.cpp)
y forma parte del cliente de comunicacion con el lector de huellas
digitales U.are.U 4500
******************************************************************/
58
#pragma once
//Encabezados para la conexion con la base de datos
#include <Winsock.h>
#include <mysql.h>
//Encabezados de DigitalPersona
#include "resource.h"
#include "dpRCodes.h"
#include "dpDefs.h"
#include "DPDevClt.h"
#include "dpFtrEx.h"
#include "dpMatch.h"
#include "DpUIApi.h"
//Encabezados manejo de cadenas de caracteres
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
using
using
using
using
using
using
using
using
using
namespace
namespace
namespace
namespace
namespace
namespace
namespace
namespace
namespace
std;
System;
System::ComponentModel;
System::Collections;
System::Windows::Forms;
System::Data;
System::Runtime::InteropServices;
System::Globalization;
System::IO;
namespace CRB {
public ref class enrrol : public System::Windows::Forms::Form{
public:
enrrol(void){
InitializeComponent();
::ZeroMemory(&m_RegTemplate, sizeof(m_RegTemplate));
}
protected:
~enrrol(){
if (components){
delete components;
}
delete [] m_RegTemplate.pbData;
m_RegTemplate.cbData = 0;
m_RegTemplate.pbData = NULL;
}
private: static const UINT FP_EVENT = (WM_USER+1);
59
private:
// Contexto de extraccion
FT_HANDLE
m_fxContext;
// Contexto de comparacion
FT_HANDLE
m_mcContext;
// Handle de la operacion
HDPOPERATION
m_hOperationEnroll;
// Numero de plantillas de pre-registro
int
m_NumberOfPreRegFeatures;
// Arreglo que contiene las pantillas de pre-registro
FT_BYTE**
m_TemplateArray;
// Indice de la plantilla de pre-registro
int
m_nRegFingerprint;
// Objeto binario donde se almacen las plantillas de huellas
dactilares
DATA_BLOB
m_RegTemplate;
// Link a la conexion con MySQL
MYSQL*
conn;
// Puntero a un objeto encargado de almacenar resultados de una
consulta
MYSQL_RES*
mysql_res;
// cadena de caracteres con una sentencia SQL
CHAR*
sql;
private:
private:
private:
private:
private:
private:
private:
private:
private:
private:
private:
private:
private:
private:
private:
private:
System::Windows::Forms::Label^
System::Windows::Forms::TextBox^
System::Windows::Forms::Label^
System::Windows::Forms::Label^
System::Windows::Forms::TextBox^
System::Windows::Forms::Label^
System::Windows::Forms::TextBox^
System::Windows::Forms::Label^
System::Windows::Forms::Label^
System::Windows::Forms::Button^
System::Windows::Forms::Button^
System::Windows::Forms::TextBox^
System::Windows::Forms::TextBox^
System::Windows::Forms::Label^
System::Windows::Forms::Label^
System::Windows::Forms::GroupBox^
label1;
textBox1;
label2;
label3;
textBox2;
label4;
textBox3;
label5;
label6;
button1;
Guar_button;
textBox4;
textBox5;
label7;
label8;
groupBox1;
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void){
System::ComponentModel::ComponentResourceManager^
resources
= (gcnew
System::ComponentModel::ComponentResourceManager(enrrol::typeid));
this->label1 = (gcnew System::Windows::Forms::Label());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->label2 = (gcnew System::Windows::Forms::Label());
60
61
62
this->Guar_button->Location = System::Drawing::Point(231,
472);
this->Guar_button->Name = L"Guar_button";
this->Guar_button->Size = System::Drawing::Size(94, 27);
this->Guar_button->TabIndex = 10;
this->Guar_button->Text = L"Guardar";
this->Guar_button->UseVisualStyleBackColor = true;
this->Guar_button->Click += gcnew System::EventHandler(this,
&enrrol::button2_Click);
//
// textBox4
//
this->textBox4->Location = System::Drawing::Point(54, 356);
this->textBox4->Name = L"textBox4";
this->textBox4->Size = System::Drawing::Size(376, 20);
this->textBox4->TabIndex = 11;
//
// textBox5
//
this->textBox5->Location = System::Drawing::Point(54, 407);
this->textBox5->Name = L"textBox5";
this->textBox5->Size = System::Drawing::Size(376, 20);
this->textBox5->TabIndex = 12;
//
// label7
//
this->label7->AutoSize = true;
this->label7->Location = System::Drawing::Point(54, 232);
this->label7->Name = L"label7";
this->label7->Size = System::Drawing::Size(76, 13);
this->label7->TabIndex = 13;
this->label7->Text = L"Primer Apellido";
//
// label8
//
this->label8->AutoSize = true;
this->label8->Location = System::Drawing::Point(51, 287);
this->label8->Name = L"label8";
this->label8->Size = System::Drawing::Size(90, 13);
this->label8->TabIndex = 14;
this->label8->Text = L"Segundo Apellido";
//
// groupBox1
//
this->groupBox1->Controls->Add(this->label1);
this->groupBox1->Controls->Add(this->label5);
this->groupBox1->Controls->Add(this->label6);
this->groupBox1->Location = System::Drawing::Point(54, 36);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(376, 122);
this->groupBox1->TabIndex = 15;
this->groupBox1->TabStop = false;
63
this->groupBox1->Text = L"Estado";
//
// enrrol
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode =
System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(473, 541);
this->Controls->Add(this->groupBox1);
this->Controls->Add(this->label8);
this->Controls->Add(this->label7);
this->Controls->Add(this->textBox5);
this->Controls->Add(this->textBox4);
this->Controls->Add(this->Guar_button);
this->Controls->Add(this->button1);
this->Controls->Add(this->textBox3);
this->Controls->Add(this->label4);
this->Controls->Add(this->textBox2);
this->Controls->Add(this->label3);
this->Controls->Add(this->label2);
this->Controls->Add(this->textBox1);
this->Icon = (cli::safe_cast<System::Drawing::Icon^
>(resources->GetObject(L"$this.Icon")));
this->MaximizeBox = false;
this->MaximumSize = System::Drawing::Size(481, 575);
this->MinimumSize = System::Drawing::Size(481, 575);
this->Name = L"enrrol";
this->StartPosition =
System::Windows::Forms::FormStartPosition::CenterScreen;
this->Text = L"Registro de Personal";
this->Load += gcnew System::EventHandler(this,
&enrrol::enrrol_Load);
this->FormClosing += gcnew
System::Windows::Forms::FormClosingEventHandler(this,
&enrrol::enrrol_FormClosing);
this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
public: System::Void
private: System::Void
System::EventArgs^ e);
private: System::Void
iFingerprintImageSize);
private: System::Void
FT_BYTE* pRegTemplate);
private: System::Void
System::EventArgs^ e);
GetConnetionLinker(MYSQL* connlink);
enrrol_Load(System::Object^ sender,
AddToEnroll(FT_IMAGE_PT pFingerprintImage, int
GuardarArchivo(int iRecommendedRegFtrLen,
button1_Click(System::Object^
64
sender,
65
/*****************************************************************
Universidad de Costa Rica
Escuela de Ingenieria Electrica
II Semestre 2009
IE-0502
Proyeto Electrico
Elaborado por: Luis Castro Leiva
A61368
Resumen: enrrol.cpp
Este archivo contiene las funciones que correponden a
la ventana de registro de nuevo personal, (ver enrrol.h)
y forma parte del cliente de comunicacion con el lector de
huellas digitales U.are.U 4500
******************************************************************/
#include "StdAfx.h"
#include "enrrol.h"
using namespace CRB;
System::Void enrrol::GetConnetionLinker(MYSQL* connlink){
//Almacena el link a la conexion establecida con MySQL
conn = connlink;
}
System::Void enrrol::enrrol_Load(System::Object^
System::EventArgs^ e) {
sender,
FT_RETCODE rc = FT_OK;
HRESULT hr = S_OK;
// Se crea un contexto para realizar una extraccion
pin_ptr<FT_HANDLE> pm_fxContext = &m_fxContext;
if (FT_OK != (rc = FX_createContext(pm_fxContext))) {
MessageBox::Show( "Error en FX_createContext", "Error");
}
// Se crea un contexto para la comparacion
pin_ptr<FT_HANDLE> pm_mcContext = &m_mcContext;
if (FT_OK != (rc = MC_createContext(pm_mcContext))) {
MessageBox::Show( "Error en MC_createContext", "Error");
}
// Se obtiene el numero de pre-plantillas necesarias para la creacion
de una plantilla de huella
// Se asigna memoria a un arreglo que almacena estas pre-plantillas
MC_SETTINGS mcSettings = {0};
if (FT_OK != (rc = MC_getSettings(&mcSettings)))
66
67
68
iRecommendedRegFtrLen,
// tamao de la plantilla
pRegTemplate,
// Pointer to the buffer where the
Enrollment template to be stored
NULL,
// Reservado, debe ser NULL.
&bRegSucceeded);
plantilla
// Resultado de la creacion de la
if (FT_OK <= rc && bRegSucceeded == FT_TRUE) {
// Plantilla generada exitosamente
m_RegTemplate.pbData = pRegTemplate;
m_RegTemplate.cbData =
iRecommendedRegFtrLen;
pRegTemplate = NULL;
this->label1->Text = L"Plantilla de
registro generada exitosamente";
this->label5->Text = L"Close this dialog
and run Verification to verify fingerprint";
}
else {
this->label1->Text = L"La creacion de la
plantilla de registro fallo";
// Existio un error en la creacion de la
plantilla
// entonces se borran las prematriculas realizadas
m_nRegFingerprint = 0;
for (int i=0; i<m_NumberOfPreRegFeatures;
++i)
if(m_TemplateArray[i]) delete []
m_TemplateArray[i], m_TemplateArray[i] = NULL;
}
}
else {
// Continua ejecutandose si no se han terminado
la cantidad de plantilla de
// pre-matricula requeridas
this->label1->Text = L"Coloque el indice derecho
nuevamente";
}
}
else {
69
70
mysql_free_result(mysql_res);
//Creacion de una Tabla en la base de datos para el nuevo
empleado
char nueva_tabla[122];
strcpy_s(nueva_tabla, 122, "CREATE TABLE `crb_db1`.`");
strcat_s(nueva_tabla,122,cod_ced);
strcat_s(nueva_tabla,122,"` (`Fecha` DATE NOT NULL ,`Hora`
TIME NOT NULL ,`Tipo` BOOL NOT NULL) ENGINE = MYISAM ;");
len = strlen(nueva_tabla);
mysql_real_query(conn, nueva_tabla ,len);
mysql_res = mysql_store_result(conn);
mysql_free_result(mysql_res);
}
else{
MessageBox::Show( "Ninguno de los campos de informacion puede
estar vacio", "Error");
}
}
}
System::Void enrrol::button1_Click(System::Object^
System::EventArgs^ e) {
this->Close();
}
sender,
71
}
}
System::Void enrrol::button2_Click(System::Object^ sender,
System::EventArgs^ e) {
this->GuardarArchivo(m_RegTemplate.cbData, m_RegTemplate.pbData);
}
72
73
width="100"
</td>
</table>
<Table align = "center" Border = 1 Cellpadding=4>
<tr>
<td>
<p>Busqueda de personal por Nombre, Primer y Segundo Apellido y Numero de
Cedula</p>
<Form Name="crb_form_busqueda" Action="" Methot="GET">
<Table align = "center" Border Cellpadding=4>
<tr>
<td>Nombre: <INPUT Type="text" Name="nombre" VALUE="" Size=25></td>
<td><Input
Type=button
OnClick="Consultar('query_name.php',this.form);
return
false" Value="Buscar"></td>
</tr>
<tr>
<td>Primer Apellido: <Input Name="apellido1" Value="" Size=16></td>
<td><Input
Type=button
OnClick="Consultar('query_apellido1.php',this.form);
return false" Value="Buscar"></td>
</tr>
<tr>
<td>Segundo Apellido: <Input Name="apellido2" Size=15></td>
<td><Input
Type=button
OnClick="Consultar('query_apellido2.php',this.form);
return false" Value="Buscar"></td>
</tr>
<tr>
<td>Cedula: <Input Name="cedula" Size=27></td>
<td><Input Type=button OnClick="Consultar('query_cedula.php',this.form); return
false" Value="Buscar"></td>
</tr>
</Table>
<p
Align
=
"center"><Input
OnClick="document.getElementById('resultado').innerHTML
=
resultados" Size=27></p>
<div id="resultado"></div>
''"
Type=button
Value="Limpiar
</Form>
</td>
<td rowspan="2">
<p Align = "center">Registro de Marcas de personal por Numero de Cedula</p>
<Form Name="crb_form_marcas" Action="" Methot="GET">
<Table align = "center" Border Cellpadding=4>
<tr>
<td>Cedula: <INPUT Type="text" Name="cedula" VALUE="" Size=25></td>
<td><Input
Type=button
OnClick="ConsultarMarcas('query_marcas.php',this.form);
return false" Value="Buscar"></td>
</tr>
</Table>
</Form>
<p
Align
=
"center"><Input
Type=button
OnClick="document.getElementById('marcas').innerHTML
=
''"
Value="Limpiar
resultados" Size=27></p>
<div id="marcas"></div>
</td>
</tr>
74
<tr>
<td>
<Form>
<p align = "center">Eliminacion de Usuarios por numero de Cedula</p>
<Table align = "center" Border Cellpadding=4>
<tr>
<td>Cedula: <Input Name="cedula_eliminar" Size=27></td>
<td><Input Type=button OnClick="Eliminar('query_eliminar.php',this.form); return
false" Value="Eliminar"></td>
</tr>
</Table>
<p
Align
=
"center"><Input
Type=button
OnClick="document.getElementById('resultado_eliminar').innerHTML
=
''"
Value="Limpiar resultados" Size=27></p>
<div id="resultado_eliminar"></div>
</Form>
</td>
</tr>
</table>
<p Align = "center">2009, Sistema CRB</p>
</body>
</html>
75
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
//La funcin Consultar se encarga de llamar el script de PHP por medio
//del objeto ajax creado al llamar la funcion objetoAjax
function Consultar(datos,form){
var nombre = form.nombre.value;
var apellido1 = form.apellido1.value;
var apellido2 = form.apellido2.value;
var cedula = form.cedula.value;
divResultado = document.getElementById('resultado');
ajax=objetoAjax();
ajax.open("GET",
datos+"?nombre="+nombre+"&apellido1="+apellido1+"&apellido2="+apellido2+"
&cedula="+cedula);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
divResultado.innerHTML = ajax.responseText
}
}
ajax.send(null)
}
function Eliminar(datos,form){
var cedula_eliminar = form.cedula_eliminar.value;
divResultado = document.getElementById('resultado_eliminar');
ajax=objetoAjax();
ajax.open("GET", datos+"?cedula="+cedula_eliminar);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
divResultado.innerHTML = ajax.responseText
}
}
ajax.send(null)
}
function ConsultarMarcas(datos,form){
var cedula = form.cedula.value;
76
divResultado = document.getElementById('marcas');
ajax=objetoAjax();
ajax.open("GET", datos+"?cedula="+cedula);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
divResultado.innerHTML = ajax.responseText
}
}
ajax.send(null)
}
77
78
79
80
81
else
echo "<p align =\"center\">Fecha | Hora </p> \n";
while($row = mysql_fetch_array($sql)){
echo "<p align =\"center\">".$row['Fecha']." |
".$row['Hora']."</p> \n";
}
mysql_free_result($sql);
}
else{
echo "<p align =\"center\">No se encuentra registrada una persona
con esta cedula</p>";
}
}
else{
echo "<p align =\"center\">Debe llenar el espacio dado para realizar la
busqueda</p>";
}
?>
82
if($_GET["cedula"]){
$sql1=mysql_query("DELETE FROM `crb_db1`.`empleados` WHERE
Cedula=".$_GET['cedula'],$link);
$sql2=mysql_query("DROP TABLE `".$_GET['cedula']."`",$link);
if (($sql1 == 1) && ($sql2 == 1)){
echo "<p align =\"center\">Se ha eliminado la persona
adecuadamente</p";
}
}
else{
echo "<p align =\"center\">No se encuentra registrada una persona con esta
cedula</p>";
}
?>
83
84
S_OK
operacin exitosa
S_FALSE
librera ya inicializada.
0x800706B3
o HRESULT DPFPTerm();
Valores de Retorno
S_OK
operacin exitosa
o HRESULT DPFPCreateAcquisition(
DP_ACQUISITION_PRIORITY eAcquisitionPriority,
REFGUID DevUID,
ULONG uSampleType,
85
HWND hWnd,
ULONG uMsg,
HDPOPERATION * phOperation);
Parametros
DevUID: numero de serie del lector a utilizar, GUID_NULL si cualquier lector puede
ser utilizado.
Valores de Retorno
S_OK
operacin exitosa
E_ACCESSDENIED
86
E_INVALIDARG
alta.
Descripcin: Crea una operacin de adquisicin.
S_OK
operacin exitosa
Descripcin: Suscribe una aplicacin cliente para recibir notificacin de eventos del
hardware.
S_OK
operacin exitosa
87
Parametros
hOperation: Handle de la operacin.
Valores de Retorno
S_OK
operacin exitosa
88
2.7.1
Funciones de extraccin
S_OK
operacin exitosa
FT_ERR_NO_MEMORY
el mdulo de extraccin
FT_ERR_BAD_INI_SETTING
corrompida.
Descripcin: Inicializa el mdulo de extraccin de huellas digitales, inicializa la estructura
MC_SETTINGS y las tablas de bsqueda para comparacin. Debe ser ejecutada antes que
cualquier funcin del mdulo de extraccin.
FT_OK
FT_WRN_NO_INIT
operacin exitosa
el modulo de extraccin no ha sido inicializado.
89
FT_OK
operacin exitosa
FT_ERR_NO_INIT
FT_ERR_INVALID_CONTEXT
contexto.
Descripcin: Crea un contexto de extraccin, si la operacin es exitosa retorna un
HANDLE que apunta al contexto creado.
o FX_DLL_INTERFACE FT_RETCODE FX_closeContext(
OUT FT_HANDLE* fxContext);
Parametros
fxContext: handle del contexto a cerrar.
Valores de Retorno
operacin exitosa
FT_OK
90
2.7.2
Funciones de comparacin
S_OK
operacin exitosa
FT_ERR_NO_MEMORY
el mdulo de comparacin
FT_ERR_BAD_INI_SETTING
corrompida.
Descripcin: Inicializa el mdulo de comparacin extraccin de huellas digitales,
inicializa. Debe ser ejecutada antes que cualquier funcin del mdulo de extraccin.
FT_OK
FT_WRN_NO_INIT
operacin exitosa
el modulo de comparacin no ha sido inicializado.
91
FT_OK
operacin exitosa
FT_OK
operacin exitosa
92
ANEXOS
Sistema CRB
Versin Alfa
MANUAL DEL USUARIO
93
Bienvenido a CRB
Bienvenido. Este documento pretende ser una gua para el manejo de la versin
Alfa del sistema CRB. Aqu encontrar toda la informacin sobre las capacidades del
programa y podr adquirir los elementos necesarios para hacer uso del mismo.
CRB es una aplicacin que le permitir estar al tanto de las horas de entrada y salida
del personal a su empresa. Este software cuenta con dos partes fundamentales: una interfaz
Web y el programa CRB que registra las marcas del personal y le permite registrar nuevos
usuarios.
Proceso de Instalacin
Por el momento, por ser esta una versin alfa, el proceso de instalacin no est
automatizado por lo cual se requiere la instalacin de personal capacitado en el tema.
94
95
Solicite a la persona a registrar que coloque el dedo sobre el lector y luego lo retire.
96
Haga click en el botn salir y vuelva a entrar si se desea registrar un nuevo usuario.
97
informara de algn error, se debe volver a colocar el dedo hasta que el rea de estado
notifique lo contrario
98
Solamente se debe acceder al sitio Web habilitado por la empresa para tal fin y llenar
los espacios requeridos para realizar las bsquedas, las consultas o la eliminacin.
Para realizar consultas de las marcas o eliminar usuarios debe conocerse el nmero de
cdula de la persona que se desea sacar del registro principal, y este es el dato que se debe
introducir en los espacios asignados para este fin.
99
100