APDUGT.dll es una librería nativa realizada en C para sistemas Windows, que lee directamente el chip de identificación de Guatemala (DPI). Se comunica con el lector a través de la API estándar de Windows y entrega los datos del documento —personales, de registro civil y biométricos, incluida la fotografía— en una sola estructura, sin depender de servicios externos.
Desde 2009 el chip de identificación de Guatemala ha pasado por cinco generaciones, cada una con su propio conjunto de campos. La librería las reconoce todas y las expone bajo la misma API: tu aplicación no necesita saber qué versión tiene la tarjeta que está en el lector, ni mantener un camino de código distinto para cada una.
No depnde de Java ni de ningún otro lenguaje de medio nivel, el SDK es Nativo para Sistemas Windows y garantizar la lectura del chip de identificación de Guatemala
Libería Nativa .dll Betaextern "C" en compilación C++)__stdcall (WINAPI)
La combinación de extern "C" + __stdcall
garantiza compatibilidad binaria con cualquier lenguaje que soporte llamadas a DLLs de Windows (FFI):
APDUGT_DPIData — Contiene datos personales, biométricos, datos de documento y campos de errorunsigned char* Foto + unsigned int FotoSizeCada versión del chip contiene diferentes campos. La siguiente tabla muestra los datos disponibles según la versión del chip:
Datos personales: CUI, PrimerNombre, SegundoNombre, PrimerApellido, SegundoApellido, ApellidoCasada, Sexo
Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento
Documento: FechaEmision, FechaVencimiento
Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil
Residencia: DireccionResidencia1, DireccionResidencia2, MunicipioResidencia, DepartamentoResidencia, CodigoPostal, PaisResidencia
Registro civil: Libro, Folio, Partida, NumeroCedula, MunicipioCedula, DepartamentoCedula
Otros: Profesion, LimitacionesFisicas, SabeLeer, SabeEscribir, OficialActivo, MRZ
Biométricos: Foto JPEG
Datos personales: CUI, Gentilicio, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, Sexo
Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento
Documento: FechaEmision, FechaVencimiento, Serie
Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil
Registro civil: Libro, Folio, Partida, NumeroCedula, MunicipioCedula, DepartamentoCedula
Educación: Idioma, EtniaComunidadLinguistica, Oficio, Profesion
Otros: LimitacionesFisicas, SabeLeer, SabeEscribir, PuedeFirmar, OficialActivo
Biométricos: Foto JPEG, NumeroHuellasAlmacenadas, Huellas (lista de dedos)
Datos personales: CUI, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, Sexo
Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento
Documento: FechaEmision, FechaVencimiento, NumeroRenovacion, Serie
Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil
Residencia: MunicipioResidencia, DepartamentoResidencia, Telefono1
Registro civil: Libro, Folio, Partida, NumeroCedula
Educación: Idioma, Oficio, Profesion
Otros: LimitacionesFisicas, SabeLeer, SabeEscribir, PuedeFirmar, OficialActivo
Biométricos: Foto JPEG, NumeroHuellasAlmacenadas, Huellas (lista de dedos)
Datos personales: CUI, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, NombreUsual, Sexo
Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento
Documento: FechaEmision, FechaVencimiento, NumeroRenovacion, Serie
Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil
Residencia: MunicipioResidencia, DepartamentoResidencia, Telefono1, Telefono2
Contacto: CorreoElectronico, NombreCompletoContacto, ParentescoContacto
Registro civil: Libro, Folio, Partida, NumeroCedula, MunicipioCedula
Educación: Estudia, Escolaridad, Idioma, EtniaComunidadLinguistica, Profesion
Otros: LimitacionesFisicas, OficialActivo
Biométricos: Foto JPEG, HuellasSTR
Datos personales: CUI, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, NombreCompleto, NombreUsual, Sexo
Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento
Documento: FechaEmision, FechaVencimiento, NumeroRenovacion, Serie
Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil
Contacto: Telefono1, Telefono2, CorreoElectronico, NombreCompletoContacto, ParentescoContacto
Registro civil: Libro, Folio, Partida, NumeroInscripcion, NumeroCedula, MunicipioCedula
Educación: Estudia, Escolaridad, Idioma, Oficio, Profesion
Características físicas: ColorTez, ColorOjos, ColorCabello, EspecificacionesCabello, LimitacionesFisicas, Lunares, Cicatrices
Otros: NIT, IdentificacionPersona, SabeLeer, SabeEscribir, PuedeFirmar, OficialActivo
Biométricos: Foto JPEG, HuellasSTR
APDUGT_DPIData.
Los campos no aplicables a una versión específica se devuelven vacíos.
APDUGT_SUCCESS — Operación exitosaAPDUGT_ERROR_NO_READERS — No se encontraron lectoresAPDUGT_ERROR_NO_CARD — No hay tarjeta presenteAPDUGT_ERROR_CONNECT — Error de conexiónwinscard.dll (Windows SmartCard API)winscard.dll viene incluida de forma nativa en todas las versiones de Windows (XP, Vista, 7, 8, 10, 11), por lo que no se requiere instalar ningún componente adicional.
El SDK incluye un wrapper P/Invoke completo para integrar APDUGT.dll en aplicaciones .NET (C#, VB.NET, F#).
examples/csharp/APDUGT.cs — Wrapper P/Invoke con todas las estructuras y funcionesexamples/csharp/Program.cs — Ejemplo completo de usocsc /out:test_APDUGT.exe Program.cs APDUGT.cs
DPIData, ReaderList, ReaderErrorCodesLicenseTypeNativeAPDUGT.dll (x64 o x86 según tu aplicación) y
apdugt.lic en el mismo directorio que tu ejecutable.
Utiliza ctypes (incluido en Python) para cargar y llamar funciones de APDUGT.dll.
import ctypes
from ctypes import Structure, c_char, c_int, c_uint, POINTER, byref
# Estructuras
class Reader(Structure):
_fields_ = [("Name", c_char * 256)]
class ReaderList(Structure):
_fields_ = [
("Readers", Reader * 16),
("Count", c_int)
]
# Cargar DLL (usar x64 o x86 según Python instalado)
dll = ctypes.WinDLL("./APDUGT.dll")
# Configurar tipos de retorno
dll.APDUGT_GetVersion.restype = ctypes.c_char_p
dll.APDUGT_ListReaders.argtypes = [POINTER(ReaderList)]
dll.APDUGT_GetCUI.argtypes = [c_int, ctypes.c_char_p]
# Obtener versión
version = dll.APDUGT_GetVersion()
print(f"Version: {version.decode()}")
# Listar lectores
readers = ReaderList()
if dll.APDUGT_ListReaders(byref(readers)) == 0:
for i in range(readers.Count):
print(f"Lector {i}: {readers.Readers[i].Name.decode()}")
# Leer CUI
cui = ctypes.create_string_buffer(32)
if dll.APDUGT_GetCUI(0, cui) == 0:
print(f"CUI: {cui.value.decode()}")
python -c "import struct; print(struct.calcsize('P')*8)"
Utiliza JNA (Java Native Access) para integrar APDUGT.dll en aplicaciones Java.
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.14.0</version>
</dependency>
import com.sun.jna.*;
import com.sun.jna.ptr.*;
public interface APDUGT extends StdCallLibrary {
// Cargar con ruta relativa o absoluta
APDUGT INSTANCE = Native.load("./APDUGT.dll", APDUGT.class);
// O ruta absoluta: Native.load("C:/ruta/APDUGT.dll", APDUGT.class);
// Estructura Reader
public static class Reader extends Structure {
public byte[] Name = new byte[256];
}
// Estructura ReaderList
public static class ReaderList extends Structure {
public Reader[] Readers = new Reader[16];
public int Count;
}
// Funciones exportadas
String APDUGT_GetVersion();
int APDUGT_ListReaders(ReaderList readerList);
int APDUGT_IsCardPresent(int readerIndex);
int APDUGT_GetChipVersion(int readerIndex, byte[] version);
int APDUGT_GetATR(int readerIndex, byte[] atr);
int APDUGT_GetCUI(int readerIndex, byte[] cui);
int APDUGT_GetLicenseType();
int APDUGT_IsLicenseValid();
}
public class Main {
public static void main(String[] args) {
APDUGT lib = APDUGT.INSTANCE;
// Verificar licencia
System.out.println("Version: " + lib.APDUGT_GetVersion());
System.out.println("Licencia valida: " + (lib.APDUGT_IsLicenseValid() == 1));
// Listar lectores
APDUGT.ReaderList readers = new APDUGT.ReaderList();
if (lib.APDUGT_ListReaders(readers) == 0) {
System.out.println("Lectores: " + readers.Count);
// Leer CUI del primer lector
byte[] cui = new byte[32];
if (lib.APDUGT_GetCUI(0, cui) == 0) {
System.out.println("CUI: " + new String(cui).trim());
}
}
}
}
APDUGT.dll en el java.library.path
o en el mismo directorio que el JAR. Usa la versión x64 con JVM de 64 bits.
Descarga el paquete completo con DLLs compiladas, ejemplos y documentación.
📦 Descargar desde Google Drive
El archivo APDUGT_v5.0.0.2-beta.zip incluye los siguientes componentes:
apdugt.lic — Licencia DEMO (compartida x64/x86)x64/APDUGT.dll — Librería nativa 64 bitsx64/test_APDUGT_x64.exe — Ejemplo compilado 64 bitsx64/apdugt.lic — Licencia DEMO para x64x86/APDUGT.dll — Librería nativa 32 bitsx86/test_APDUGT_x86.exe — Ejemplo compilado 32 bitsx86/apdugt.lic — Licencia DEMO para x86apdugt_request_gui.exe — Generador de solicitud de licencia (interfaz gráfica)test_APDUGT.c — Ejemplo en Capdugt.h — Header público con definiciones de la APIcsharp/APDUGT.cs — Wrapper P/Invoke para .NET (C#, VB.NET, F#)csharp/Program.cs — Ejemplo de uso en C#index.html — Documentación técnica del SDKREADME.txt — Guía rápida de inicio (en raíz)ReadDPI(), solicita una licencia FULL usando apdugt_request_gui.exe.
Escríbenos y te respondemos con una propuesta inicial en menos de 24 horas.
HABLEMOS HABLEMOS