ECFDllVB6 SDK

Biblioteca COM para manejo de e-CF DGII • Resúmenes • Envíos • QR Oficial

Desarrollada por: Natanael Sanchez M.

📌 Descripción General

ECFDllVB6 es una biblioteca COM desarrollada en C# (.NET Framework 4.x), diseñada para ser utilizada desde Delphi, VB6, VB.NET, C++ y cualquier lenguaje compatible COM.

Permite procesar comprobantes electrónicos DGII (e-CF), generar resúmenes RFCE, enviar XML firmados y generar códigos QR oficiales.

⬇️ Descargas

⚙️ Instalación y Registro COM

1. Copie los archivos en una carpeta segura.

2. Abra una consola como Administrador.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "ECFDllVB6.dll" /codebase /tlb

3. Importe la Type Library en Delphi:

Component → Import Component → Import a Type Library

📚 Métodos Disponibles

string GenerarResumen(string rutaXmlFirmado)

Generar el XML RFCE dinámico a partir de un e-CF firmado.

void GuardarResumen(string ruta, string texto)

Guarda texto UTF-8 sin BOM.

string GenerarQr(string xmlInput)

Genera la URL oficial DGII para el QR.

void GenerarQRImagen(string texto, string rutaImagenPng)

Descarga y guarda el QR como imagen PNG.

string ObtenerCodigoSeguridad(string rutaXmlFirmado)

Extrae los primeros 6 caracteres del SignatureValue.

string EnviarXml(string xmlFile, string urlEnvio, string token)

Envía un XML firmado a DGII usando multipart/form-data.

🧪 Ejemplo Completo en Delphi

unit HelloWorld;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
  Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Imaging.pngimage, 
  ECFDllVB6_TLB; // Librería de Facturación Electrónica

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  util            : IUtilidades;
  rutaXml         : string;
  rutaSalidaXml   : string;
  xmlName         : string;
  resultadoXml    : string;
  urlEnvio        : string;
  token           : string;
  resultadoEnvio  : string;
  codigoSeguridad : string;
  qr              : string;
  qrPath          : string;
begin
  // --- Configuración de parámetros ---
  token    := 'token';
  urlEnvio := 'https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
  xmlName  := '133398771E320000000875.xml';
  
  // Definición de rutas
  rutaXml       := 'C:\Users\MeMeBigBoy\Desktop\' + xmlName;
  rutaSalidaXml := 'C:\Users\MeMeBigBoy\Desktop\resumen\' + xmlName;
  qrPath        := 'C:\Users\MeMeBigBoy\Desktop\qr\' + xmlName + '.png';

  // --- Ejecución de procesos con la DLL ---
  util := CoUtilidades.Create;

  // 1. Generar y Guardar Resumen
  resultadoXml := util.GenerarResumen(rutaXml);
  ShowMessage('Resumen generado: ' + resultadoXml);
  
  util.GuardarResumen(rutaSalidaXml, resultadoXml);
  ShowMessage('XML guardado correctamente en: ' + rutaSalidaXml);

  // 2. Enviar XML al Web Service
  resultadoEnvio := util.EnviarXml(rutaXml, urlEnvio, token);
  ShowMessage('Resultado Envío: ' + resultadoEnvio);

  // 3. Obtener Código de Seguridad
  codigoSeguridad := util.ObtenerCodigoSeguridad(rutaXml);
  ShowMessage('Código de Seguridad: ' + codigoSeguridad);

  // 4. Manejo de QR
  qr := util.GenerarQr(rutaXml);
  util.GenerarQRImagen(qr, qrPath);
  
  // Cargar imagen en el formulario
  Image1.Picture.LoadFromFile(qrPath);
  Edit1.Text := qr;
end;

end.

🧪 Ejemplo Completo en Visual Basic 6

' Ejemplo de uso en VB6

Option Explicit

Private Sub Command1_Click()
    ' Declaración de variables (utilizando el objeto de la DLL)
    Dim util            As ECFDllVB6.Utilidades
    Dim rutaXml         As String
    Dim rutaSalidaXml   As String
    Dim xmlName         As String
    Dim resultadoXml    As String
    Dim urlEnvio        As String
    Dim token           As String
    Dim resultadoEnvio  As String
    Dim codigoSeguridad As String
    Dim qr              As String
    Dim qrPath          As String

    On Error GoTo ErrorHandler

    ' --- Configuración de parámetros ---
    token = "token"
    urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    xmlName = "133398771E320000000875.xml"
    
    ' Definición de rutas (ajusta según tu entorno)
    rutaXml = "C:\Users\MeMeBigBoy\Desktop\" & xmlName
    rutaSalidaXml = "C:\Users\MeMeBigBoy\Desktop\resumen\" & xmlName
    qrPath = "C:\Users\MeMeBigBoy\Desktop\qr\" & xmlName & ".png"

    ' --- Inicialización del objeto COM ---
    Set util = New ECFDllVB6.Utilidades

    ' 1. Generar y Guardar Resumen
    resultadoXml = util.GenerarResumen(rutaXml)
    MsgBox "Resumen generado: " & resultadoXml, vbInformation
    
    util.GuardarResumen rutaSalidaXml, resultadoXml
    MsgBox "XML guardado correctamente en: " & rutaSalidaXml, vbInformation

    ' 2. Enviar XML al Web Service
    resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token)
    MsgBox "Resultado Envío: " & resultadoEnvio, vbInformation

    ' 3. Obtener Código de Seguridad
    codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml)
    MsgBox "Código de Seguridad: " & codigoSeguridad, vbInformation

    ' 4. Manejo de QR
    qr = util.GenerarQr(rutaXml)
    util.GenerarQRImagen qr, qrPath
    
    ' Mostrar en los controles del formulario
    ' Nota: VB6 nativo no soporta PNG en el control Image estándar sin ayuda de GDI+
    ' pero si la DLL genera el archivo, intentamos cargarlo:
    On Error Resume Next
    Set Image1.Picture = LoadPicture(qrPath)
    On Error GoTo ErrorHandler
    
    Text1.Text = qr

    ' Limpieza
    Set util = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "Error: " & Err.Description, vbCritical, "Error de Ejecución"
    Set util = Nothing
End Sub

🧪 Ejemplo Completo en C#


using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
// Asegúrate de agregar la referencia COM para que este namespace esté disponible
using ECFDllVB6; 

namespace ProyectoFacturacion
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnProcesar_Click(object sender, EventArgs e)
        {
            // Declaración de variables
            // En C#, la interfaz IUtilidades suele ser expuesta por la clase Utilidades
            Utilidades util;
            string rutaXml;
            string rutaSalidaXml;
            string xmlName;
            string resultadoXml;
            string urlEnvio;
            string token;
            string resultadoEnvio;
            string codigoSeguridad;
            string qr;
            string qrPath;

            try
            {
                // --- Configuración de parámetros ---
                token = "token";
                urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                xmlName = "133398771E320000000875.xml";

                // Definición de rutas (Usando @ para ignorar caracteres de escape)
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                rutaXml = Path.Combine(desktopPath, xmlName);
                rutaSalidaXml = Path.Combine(desktopPath, "resumen", xmlName);
                qrPath = Path.Combine(desktopPath, "qr", xmlName + ".png");

                // --- Ejecución de procesos con la DLL ---
                util = new Utilidades();

                // 1. Generar y Guardar Resumen
                resultadoXml = util.GenerarResumen(rutaXml);
                MessageBox.Show("Resumen generado: " + resultadoXml, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);

                util.GuardarResumen(rutaSalidaXml, resultadoXml);
                MessageBox.Show("XML guardado correctamente en: " + rutaSalidaXml);

                // 2. Enviar XML al Web Service
                resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token);
                MessageBox.Show("Resultado Envío: " + resultadoEnvio);

                // 3. Obtener Código de Seguridad
                codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml);
                MessageBox.Show("Código de Seguridad: " + codigoSeguridad);

                // 4. Manejo de QR
                qr = util.GenerarQr(rutaXml);
                util.GenerarQRImagen(qr, qrPath);

                // Cargar imagen en el PictureBox (Equivalente a TImage)
                if (File.Exists(qrPath))
                {
                    pictureBox1.Image = Image.FromFile(qrPath);
                }
                
                // Mostrar texto del QR en un TextBox (Equivalente a TEdit)
                txtQr.Text = qr;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error de ejecución", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}

🧪 Ejemplo Completo en C# (Consola)


using System;
using System.IO;
// Asegúrate de haber agregado la referencia COM a ECFDllVB6
using ECFDllVB6; 

namespace FacturacionConsola
{
    class Program
    {
        static void Main(string[] args)
        {
            // --- Declaración de variables ---
            Utilidades util;
            string rutaXml;
            string rutaSalidaXml;
            string xmlName;
            string resultadoXml;
            string urlEnvio;
            string token;
            string resultadoEnvio;
            string codigoSeguridad;
            string qr;
            string qrPath;

            Console.WriteLine("========================================");
            Console.WriteLine("   PROCESAMIENTO DE E-CF (CONSOLA)      ");
            Console.WriteLine("========================================\n");

            try
            {
                // --- Configuración de parámetros ---
                token = "token";
                urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                xmlName = "133398771E320000000875.xml";

                // Definición de rutas dinámicas al Escritorio
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                rutaXml = Path.Combine(desktopPath, xmlName);
                rutaSalidaXml = Path.Combine(desktopPath, "resumen", xmlName);
                qrPath = Path.Combine(desktopPath, "qr", xmlName + ".png");

                // --- Inicialización del objeto COM ---
                util = new Utilidades();

                // 1. Generar Resumen
                Console.WriteLine("-> Generando Resumen...");
                resultadoXml = util.GenerarResumen(rutaXml);
                Console.WriteLine("Resumen generado con éxito.");

                // Guardar Resumen
                util.GuardarResumen(rutaSalidaXml, resultadoXml);
                Console.WriteLine($"Archivo guardado en: {rutaSalidaXml}");

                // 2. Enviar XML
                Console.WriteLine("\n-> Enviando XML a DGII...");
                resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token);
                Console.WriteLine($"Resultado Envío: {resultadoEnvio}");

                // 3. Obtener Código de Seguridad
                codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml);
                Console.WriteLine($"\n-> Código de Seguridad: {codigoSeguridad}");

                // 4. Manejo de QR
                Console.WriteLine("\n-> Generando QR...");
                qr = util.GenerarQr(rutaXml);
                util.GenerarQRImagen(qr, qrPath);
                
                Console.WriteLine($"URL del QR: {qr}");
                Console.WriteLine($"Imagen QR guardada en: {qrPath}");

                Console.WriteLine("\n========================================");
                Console.WriteLine("   PROCESO FINALIZADO CORRECTAMENTE     ");
                Console.WriteLine("========================================");
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine($"\n[ERROR]: {ex.Message}");
                Console.ResetColor();
            }

            Console.WriteLine("\nPresione cualquier tecla para salir...");
            Console.ReadKey();
        }
    }
}

🧪 Ejemplo Completo en C# (Consola 2)


using System;
using System.IO;
using ECFDllVB6; 

namespace FacturacionBatch
{
    class Program
    {
        static void Main(string[] args)
        {
            // Instancia de la DLL
            Utilidades util = new Utilidades();

            // --- Configuración de Parámetros ---
            string token = "token";
            string urlEnvio = "https://portalmultiprod.com/api/certecf/enviar/2dbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            
            // Rutas principales
            string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string carpetaEntrada = Path.Combine(desktopPath, "Facturas_Para_Procesar");
            string carpetaResumen = Path.Combine(desktopPath, "resumen");
            string carpetaQR = Path.Combine(desktopPath, "qr");

            // Crear carpetas si no existen
            Directory.CreateDirectory(carpetaEntrada);
            Directory.CreateDirectory(carpetaResumen);
            Directory.CreateDirectory(carpetaQR);

            Console.WriteLine("========================================");
            Console.WriteLine("    BATCH PROCESSOR - e-CF DGII");
            Console.WriteLine("========================================\n");
            Console.WriteLine($"Buscando XMLs en: {carpetaEntrada}\n");

            // Obtener todos los archivos XML de la carpeta de entrada
            string[] archivos = Directory.GetFiles(carpetaEntrada, "*.xml");

            if (archivos.Length == 0)
            {
                Console.WriteLine("No se encontraron archivos XML para procesar.");
            }
            else
            {
                foreach (string rutaXml in archivos)
                {
                    string nombreArchivo = Path.GetFileName(rutaXml);
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.WriteLine($"--- Procesando: {nombreArchivo} ---");
                    Console.ResetColor();

                    try
                    {
                        // 1. Generar y Guardar Resumen
                        string resultadoXml = util.GenerarResumen(rutaXml);
                        string rutaSalidaXml = Path.Combine(carpetaResumen, nombreArchivo);
                        util.GuardarResumen(rutaSalidaXml, resultadoXml);
                        Console.WriteLine("[OK] Resumen generado y guardado.");

                        // 2. Enviar XML
                        string resultadoEnvio = util.EnviarXml(rutaXml, urlEnvio, token);
                        Console.WriteLine($"[OK] Envío DGII: {resultadoEnvio}");

                        // 3. Obtener Código de Seguridad
                        string codigoSeguridad = util.ObtenerCodigoSeguridad(rutaXml);
                        Console.WriteLine($"[OK] Código Seguridad: {codigoSeguridad}");

                        // 4. Generar Imagen QR
                        string qrUrl = util.GenerarQr(rutaXml);
                        string rutaImagenQr = Path.Combine(carpetaQR, nombreArchivo + ".png");
                        util.GenerarQRImagen(qrUrl, rutaImagenQr);
                        Console.WriteLine("[OK] Imagen QR generada.");

                        Console.WriteLine("----------------------------------------\n");
                    }
                    catch (Exception ex)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine($"[ERROR] en {nombreArchivo}: {ex.Message}");
                        Console.ResetColor();
                    }
                }
            }

            Console.WriteLine("========================================");
            Console.WriteLine("        PROCESAMIENTO FINALIZADO");
            Console.WriteLine("========================================");
            Console.WriteLine("Presione cualquier tecla para salir...");
            Console.ReadKey();
        }
    }
}