EAN-13 Barcode Check Digit Calculator



Càpita di dover controllare al volo la validità di un codice a barre EAN13 e quindi il relativo check digit.
Ecco una semplice utility in MFC che esegue il check del carattere di controllo.




download EAN13 Check Digit Demo Application 

Richiede Microsoft Visual C++ 2010 Redistributable Package (x86);



Per gli sviluppatori:

download del pacchetto self-extractor con il component per il calcolo del check digit in formato DLL (x86 e x64).

download EAN13 Check Digit DLL x86 e x64 


Come usare la DLL:

Visual C++:
#include "stdafx.h"
#include "BCodeCheckTest.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// L'unico oggetto applicazione

CWinApp theApp;

using namespace std;



typedef wchar_t *(__stdcall *CHECK_NUM)(wchar_t *_ean);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	
	//Inizializzazione MFC
	int nRetCode = 0;

	HMODULE hModule = ::GetModuleHandle(NULL);

	if (hModule != NULL)
	{
		// inizializza MFC e visualizza un messaggio in caso di errore
		if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
		{
			// TODO: modificare il codice di errore in base alle esigenze
			_tprintf(_T("Errore irreversibile: inizializzazione di MFC non riuscita\n"));
			nRetCode = 1;
		}
		else
		{
			// TODO: codificare il comportamento dell'applicazione.
			HMODULE hMd = LoadLibrary(_T("bcodesupport_x86.dll"));

			if(hMd != NULL)
			{
			
	      //Chiamo la funzione GetCheckNum nella DLL
	       wchar_t *m_ean12_chars = _T("800317001479");

           CHECK_NUM CheckNumber;

	       CheckNumber = (CHECK_NUM) GetProcAddress(hMd,(LPCSTR)("GetCheckNum"));

		   wchar_t *m_CheckChar = CheckNumber(m_ean12_chars);

		   wcout << "Check digit : " << (LPCSTR)(m_CheckChar) << endl << endl;
		   
		   wcout << "EAN13 : " << m_ean12_chars << (LPCSTR)(m_CheckChar) << endl << endl << "Premere un tasto per continuare..." << endl;

		   getchar();
			}


		  FreeLibrary(hMd);
		}
	}
	else
	{
		// TODO: modificare il codice di errore in base alle esigenze.
		_tprintf(_T("Errore irreversibile: GetModuleHandle non riuscito\n"));
		nRetCode = 1;
	}


	return nRetCode;
}


C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace bcodecheck
{
 
    public partial class Form1 : Form
    {

         
         //Compilare settando : "Piattaforma di destinazione x86" 
         //se usi la versione x86;
         //"Any CPU" se usi la versione x64;

[DllImport("bcodesupport_x86.dll", CallingConvention=CallingConvention.StdCall, 
CharSet=CharSet.Unicode)]

public static extern IntPtr GetCheckNum(string bcode);

        public Form1()
        {
            InitializeComponent();
        }

     
        private void button1_Click(object sender, EventArgs e)
        {
             string val = Marshal.PtrToStringAnsi(GetCheckNum(textBox1.Text));
             textBox2.Text = val;
           

        }

      
    }
}
Delphi:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

  function GetCheckNum(ean:PAnsiChar):PansiChar;stdcall;external 'bcodesupport_x86.dll';

type
  TForm2 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }


  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var ean12 : PAnsiChar;
begin
ean12 := PAnsiChar(Edit1.Text);
Edit2.Text := GetCheckNum(ean12);
Edit3.Text := Edit1.Text + Edit2.Text;
end;

end.


Copyright (C) 2013 Giuseppe Pischedda


Se il post ti è piaciuto puoi fare una donazione all'autore, l'importo è a tua libera scelta.

Grazie