[ sokomm @ 27.06.2010. 23:52 ] @
Da li i kako se moze upotrebiti CelikAPI.h i CelikAPI.dll u Delphiju radi citanja Licnih Karti ?

http://www.mup.gov.rs/cms/resursi.nsf/CelikApi%20Windows%201.01.zip
[ savkic @ 28.06.2010. 01:13 ] @
> Da li i kako se moze upotrebiti CelikAPI.h i CelikAPI.dll u Delphiju radi citanja Licnih Karti ?

Bila je diskusija o tome ali u C++ grupi, ne znam koliko ti može pomoći ali ne može da škodi:
http://www.elitesecurity.org/t372490.
[ sokomm @ 28.06.2010. 01:46 ] @
Vec sam je prcitao ali mi nije pomoglo :(
[ abitbp6 @ 28.06.2010. 02:10 ] @
Potrebno je da prevedeš celikapi.h na Delphi. Koliko vidim, prevod na Delphi uopšte nije težak, strukture podataka su jednostavne, ne bi trebalo da imaš problema sa tim, ako znaš i C i Delphi.
[ savkic @ 28.06.2010. 15:22 ] @
> Vec sam je prcitao ali mi nije pomoglo :(

Zašto, samo treba da prevedeš iz Ca u Delphi. Za konverziju pogledaj http://rvelthuis.de/programs/convertpack.html, a ima i drugih alata koji to mogu manje ili više uraditi.
[ sokomm @ 28.06.2010. 17:28 ] @
Nikada nisam radeo sa C-om samo sa pascal.
Nasao sam program za automatsko prevodjenje C header u pascal, ali ne znam da li je on to lepo preveo.

celikapi.h

Code:
// CelikApi.h
//
#pragma once

#ifdef __cplusplus
extern "C" {
#endif

#ifndef WINAPI
#define WINAPI __stdcall
#endif

#ifndef EID_API
#define EID_API
#endif

//
// Constants
//

// Size of all UTF-8 fields in bytes

const int EID_MAX_DocRegNo = 9;
const int EID_MAX_IssuingDate = 10;
const int EID_MAX_ExpiryDate = 10;
const int EID_MAX_IssuingAuthority = 30;

const int EID_MAX_PersonalNumber = 13;
const int EID_MAX_Surname = 60;
const int EID_MAX_GivenName = 40;
const int EID_MAX_ParentGivenName = 25;
const int EID_MAX_Sex = 2;
const int EID_MAX_PlaceOfBirth = 25;
const int EID_MAX_StateOfBirth = 25;
const int EID_MAX_DateOfBirth = 10;
const int EID_MAX_CommunityOfBirth = 25;

const int EID_MAX_State = 3;
const int EID_MAX_Community = 25;
const int EID_MAX_Place = 25;
const int EID_MAX_Street = 36;
const int EID_MAX_HouseNumber = 5;
const int EID_MAX_HouseLetter = 2;
const int EID_MAX_Entrance = 3;
const int EID_MAX_Floor = 3;
const int EID_MAX_ApartmentNumber = 6;

const int EID_MAX_Portrait = 7700;

//
// Function return values
//

const int EID_OK                            =  0;
const int EID_E_GENERAL_ERROR               = -1;
const int EID_E_INVALID_PARAMETER           = -2;
const int EID_E_VERSION_NOT_SUPPORTED       = -3;
const int EID_E_NOT_INITIALIZED             = -4;
const int EID_E_UNABLE_TO_EXECUTE           = -5;
const int EID_E_READER_ERROR                = -6;
const int EID_E_CARD_MISSING                = -7;
const int EID_E_CARD_UNKNOWN                = -8;
const int EID_E_CARD_MISMATCH               = -9;
const int EID_E_UNABLE_TO_OPEN_SESSION      = -10;
const int EID_E_DATA_MISSING                = -11;
const int EID_E_CARD_SECFORMAT_CHECK_ERROR  = -12;
const int EID_E_SECFORMAT_CHECK_CERT_ERROR  = -13;

//
// Structures
//

// NOTE: char arrays DO NOT have zero char at the end

typedef struct tagEID_DOCUMENT_DATA
{
    char docRegNo[EID_MAX_DocRegNo];
    int docRegNoSize;
    char issuingDate[EID_MAX_IssuingDate];
    int issuingDateSize;
    char expiryDate[EID_MAX_ExpiryDate];
    int expiryDateSize;
    char issuingAuthority[EID_MAX_IssuingAuthority];
    int issuingAuthoritySize;
} EID_DOCUMENT_DATA, *PEID_DOCUMENT_DATA;

typedef struct tagEID_FIXED_PERSONAL_DATA
{
    char personalNumber[EID_MAX_PersonalNumber];
    int personalNumberSize;
    char surname[EID_MAX_Surname];
    int surnameSize;
    char givenName[EID_MAX_GivenName];
    int givenNameSize;
    char parentGivenName[EID_MAX_ParentGivenName];
    int parentGivenNameSize;
    char sex[EID_MAX_Sex];
    int sexSize;
    char placeOfBirth[EID_MAX_PlaceOfBirth];
    int placeOfBirthSize;
    char stateOfBirth[EID_MAX_StateOfBirth];
    int stateOfBirthSize;
    char dateOfBirth[EID_MAX_DateOfBirth];
    int dateOfBirthSize;
    char communityOfBirth[EID_MAX_CommunityOfBirth];
    int communityOfBirthSize;
} EID_FIXED_PERSONAL_DATA, *PEID_FIXED_PERSONAL_DATA;

typedef struct tagEID_VARIABLE_PERSONAL_DATA
{
    char state[EID_MAX_State];
    int stateSize;
    char community[EID_MAX_Community];
    int communitySize;
    char place[EID_MAX_Place];
    int placeSize;
    char street[EID_MAX_Street];
    int streetSize;
    char houseNumber[EID_MAX_HouseNumber];
    int houseNumberSize;
    char houseLetter[EID_MAX_HouseLetter];
    int houseLetterSize;
    char entrance[EID_MAX_Entrance];
    int entranceSize;
    char floor[EID_MAX_Floor];
    int floorSize;
    char apartmentNumber[EID_MAX_ApartmentNumber];
    int apartmentNumberSize;
} EID_VARIABLE_PERSONAL_DATA, *PEID_VARIABLE_PERSONAL_DATA;

typedef struct tagEID_PORTRAIT
{
    BYTE portrait[EID_MAX_Portrait];
    int portraitSize;
} EID_PORTRAIT, *PEID_PORTRAIT;


//
// Functions
//
EID_API int WINAPI EidStartup(int nApiVersion);
EID_API int WINAPI EidCleanup();

EID_API int WINAPI EidBeginRead(LPCSTR szReader);
EID_API int WINAPI EidEndRead();

EID_API int WINAPI EidReadDocumentData(PEID_DOCUMENT_DATA pData);
EID_API int WINAPI EidReadFixedPersonalData(PEID_FIXED_PERSONAL_DATA pData);
EID_API int WINAPI EidReadVariablePersonalData(PEID_VARIABLE_PERSONAL_DATA pData);
EID_API int WINAPI EidReadPortrait(PEID_PORTRAIT pData);


#ifdef __cplusplus
};
#endif



preveden celikapi.pas

Code:
unit CELIKAPI;

interface
uses
{$IFDEF WIN32}
  Windows;
{$ELSE}
  Wintypes, WinProcs;
{$ENDIF}


{/// CelikApi.h }
{/// }
{ #pragma once }

{$IFDEF __cplusplus}
{$ENDIF}

{$IFNDEF WINAPI}
const
  WINAPI = __stdcall;
{$ENDIF}

{$IFNDEF EID_API}
{$DEFINE EID_API}
{$ENDIF}

{/// }
{/// Constants }
{/// }

{/// Size of all UTF-8 fields in bytes }





{/// }
{/// Function return values }
{/// }


{/// }
{/// Structures }
{/// }

{/// NOTE: char arrays DO NOT have zero char at the end }

type
  tagEID_DOCUMENT_DATA = record
    docRegNo: Array[0..EID_MAX_DocRegNo-1] of Char;
    docRegNoSize: Integer;
    issuingDate: Array[0..EID_MAX_IssuingDate-1] of Char;
    issuingDateSize: Integer;
    expiryDate: Array[0..EID_MAX_ExpiryDate-1] of Char;
    expiryDateSize: Integer;
    issuingAuthority: Array[0..EID_MAX_IssuingAuthority-1] of Char;
    issuingAuthoritySize: Integer;
  end {tagEID_DOCUMENT_DATA};

type
  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: Array[0..EID_MAX_PersonalNumber-1] of Integer;
    personalNumberSize: Integer;
    surname: Array[0..EID_MAX_Surname-1] of Char;
    surnameSize: Integer;
    givenName: Array[0..EID_MAX_GivenName-1] of Char;
    givenNameSize: Integer;
    parentGivenName: Array[0..EID_MAX_ParentGivenName-1] of Char;
    parentGivenNameSize: Integer;
    sex: Array[0..EID_MAX_Sex-1] of Char;
    sexSize: Integer;
    placeOfBirth: Array[0..EID_MAX_PlaceOfBirth-1] of Char;
    placeOfBirthSize: Integer;
    stateOfBirth: Array[0..EID_MAX_StateOfBirth-1] of Char;
    stateOfBirthSize: Integer;
    dateOfBirth: Array[0..EID_MAX_DateOfBirth-1] of Char;
    dateOfBirthSize: Integer;
    communityOfBirth: Array[0..EID_MAX_CommunityOfBirth-1] of Char;
    communityOfBirthSize: Integer;
  end {tagEID_FIXED_PERSONAL_DATA};

type
  tagEID_VARIABLE_PERSONAL_DATA = record
    state: Array[0..EID_MAX_State-1] of Char;
    stateSize: Integer;
    community: Array[0..EID_MAX_Community-1] of Char;
    communitySize: Integer;
    place: Array[0..EID_MAX_Place-1] of Char;
    placeSize: Integer;
    street: Array[0..EID_MAX_Street-1] of Char;
    streetSize: Integer;
    houseNumber: Array[0..EID_MAX_HouseNumber-1] of Char;
    houseNumberSize: Integer;
    houseLetter: Array[0..EID_MAX_HouseLetter-1] of Char;
    houseLetterSize: Integer;
    entrance: Array[0..EID_MAX_Entrance-1] of Char;
    entranceSize: Integer;
    floor: Array[0..EID_MAX_Floor-1] of Char;
    floorSize: Integer;
    apartmentNumber: Array[0..EID_MAX_ApartmentNumber-1] of Char;
    apartmentNumberSize: Integer;
  end {tagEID_VARIABLE_PERSONAL_DATA};

type
  tagEID_PORTRAIT = record
    portrait: Array[0..EID_MAX_Portrait-1] of BYTE;
    portraitSize: Integer;
  end {tagEID_PORTRAIT};


{/// }
{/// Functions }
{/// }
var
  EidStartup: function(nApiVersion: Integer): EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 
var
  EidCleanup: function: EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 

var
  EidBeginRead: function(var szReader: CSTR): EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 
var
  EidEndRead: function: EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 

var
  EidReadDocumentData: function(var pData: EID_DOCUMENT_DATA): EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 
var
  EidReadFixedPersonalData: function(var pData: EID_FIXED_PERSONAL_DATA): EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 
var
  EidReadVariablePersonalData: function(var pData: EID_VARIABLE_PERSONAL_DATA): EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 
var
  EidReadPortrait: function(var pData: EID_PORTRAIT): EID_API {$IFDEF WIN32} stdcall {$ENDIF}; 


{$IFDEF __cplusplus}
{$ENDIF}

var
  DLLLoaded: Boolean { is DLL (dynamically) loaded already? }
    {$IFDEF WIN32} = False; {$ENDIF}

implementation

var
  SaveExit: pointer;
  DLLHandle: THandle;
{$IFNDEF MSDOS}
  ErrorMode: Integer;
{$ENDIF}

  procedure NewExit; far;
  begin
    ExitProc := SaveExit;
    FreeLibrary(DLLHandle)
  end {NewExit};

procedure LoadDLL;
begin
  if DLLLoaded then Exit;
{$IFNDEF MSDOS}
  ErrorMode := SetErrorMode($8000{SEM_NoOpenFileErrorBox});
{$ENDIF}
  DLLHandle := LoadLibrary('CELIKAPI.DLL');
  if DLLHandle >= 32 then
  begin
    DLLLoaded := True;
    SaveExit := ExitProc;
    ExitProc := @NewExit;
    @EidStartup := GetProcAddress(DLLHandle,'EidStartup');
  {$IFDEF WIN32}
    Assert(@EidStartup <> nil);
  {$ENDIF}
    @EidCleanup := GetProcAddress(DLLHandle,'EidCleanup');
  {$IFDEF WIN32}
    Assert(@EidCleanup <> nil);
  {$ENDIF}
    @EidBeginRead := GetProcAddress(DLLHandle,'EidBeginRead');
  {$IFDEF WIN32}
    Assert(@EidBeginRead <> nil);
  {$ENDIF}
    @EidEndRead := GetProcAddress(DLLHandle,'EidEndRead');
  {$IFDEF WIN32}
    Assert(@EidEndRead <> nil);
  {$ENDIF}
    @EidReadDocumentData := GetProcAddress(DLLHandle,'EidReadDocumentData');
  {$IFDEF WIN32}
    Assert(@EidReadDocumentData <> nil);
  {$ENDIF}
    @EidReadFixedPersonalData := GetProcAddress(DLLHandle,'EidReadFixedPersonalData');
  {$IFDEF WIN32}
    Assert(@EidReadFixedPersonalData <> nil);
  {$ENDIF}
    @EidReadVariablePersonalData := GetProcAddress(DLLHandle,'EidReadVariablePersonalData');
  {$IFDEF WIN32}
    Assert(@EidReadVariablePersonalData <> nil);
  {$ENDIF}
    @EidReadPortrait := GetProcAddress(DLLHandle,'EidReadPortrait');
  {$IFDEF WIN32}
    Assert(@EidReadPortrait <> nil);
  {$ENDIF}
  end
  else
  begin
    DLLLoaded := False;
    { Error: CELIKAPI.DLL could not be loaded !! }
  end;
{$IFNDEF MSDOS}
  SetErrorMode(ErrorMode)
{$ENDIF}
end {LoadDLL};

begin
  LoadDLL;
end.