[ xcsdsgn @ 28.09.2010. 18:09 ] @
Imam C file(CelikApi.h) koji treba konvertovati, pokusavao sam ali nista od toga ....

Ako je neko raspolozen za ovu temu i moj problem neka mi pomogne

Kod:


// 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);

EID_API int WINAPI EidReadDocumentDataP(char *pchDocRegNo, int *pnDocRegNoSize,
char *pchIssuingDate, int *pnIssuingDateSize,
char *pchExpiryDate, int *pnExpiryDateSize,
char *pchIssuingAuthority, int *pnIssuingAuthoritySize);

EID_API int WINAPI EidReadFixedPersonalDataP(char *pchPersonalNumber, int *pnPersonalNumberSize,
char *pchSurname, int *pnSurnameSize,
char *pchGivenName, int *pnGivenNameSize,
char *pchParentGivenName, int *pnParentGivenNameSize,
char *pchSex, int *pnSexSize,
char *pchPlaceOfBirth, int *pnPlaceOfBirthSize,
char *pchStateOfBirth, int *pnStateOfBirthSize,
char *pchDateOfBirth, int *pnDateOfBirthSize,
char *pchCommunityOfBirth, int *pnCommunityOfBirthSize);

EID_API int WINAPI EidReadVariablePersonalDataP(char *pchState, int *pnStateSize,
char *pchCommunity, int *pnCommunitySize,
char *pchPlace, int *pnPlaceSize,
char *pchStreet, int *pnStreetSize,
char *pchHouseNumber, int *pnHouseNumberSize,
char *pchHouseLetter, int *pnHouseLetterSize,
char *pchEntrance, int *pnEntranceSize,
char *pchFloor, int *pnFloorSize,
char *pchApartmentNumber, int *pnApartmentNumberSize);

EID_API int WINAPI EidReadPortraitP(BYTE *pchPortrait, int *pnPortraitSize);


#ifdef __cplusplus
};
#endif
[ savkic @ 28.09.2010. 18:26 ] @
> Imam C file(CelikApi.h) koji treba konvertovati, pokusavao sam ali nista od toga ....

Iskoristi neki od postojećih alata za konverziju.

http://rvelthuis.de/programs/convertpack.html
http://www.drbob42.com/headconv/index.htm
http://c2pas.sourceforge.net/
[ xcsdsgn @ 28.09.2010. 21:09 ] @
Hvala, nisam ovako nesto radio, voleo bih neko od iskusnijih programera da prover ovaj kodi...

Unapred hvala jos jednom



unit CELIKAPI;
{**************************************************************************}
{ }
{ This C DLL header file first (automatic) conversion generated by: }
{ HeadConv 4.0 (c) 2000 by Bob Swart (aka Dr.Bob - www.drbob42.com) }
{ Final Delphi-Jedi (Darth) command-line units edition }
{ }
{ Generated Date: 28.9.2010 }
{ Generated Time: 20:02:40 }
{ }
{**************************************************************************}

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


{=> c:\documents and settings\korisnik\desktop\CELIKAPI.H <=}

{ #pragma once }

{$IFDEF __cplusplus}
{$ENDIF}

{$IFNDEF WINAPI}

{$ENDIF}

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



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

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

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

const EID_MAX_Portrait = 7700;



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










type
EID_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
EID_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
EID_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
EID_PORTRAIT = record
portrait: Array[0..EID_MAX_Portrait-1] of BYTE;
portraitSize: Integer;
end {tagEID_PORTRAIT};


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

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

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

var
EidReadDocumentDataP: function(pchDocRegNo: PChar;
var pnDocRegNoSize: Integer;
pchIssuingDate: PChar;
var pnIssuingDateSize: Integer;
pchExpiryDate: PChar;
var pnExpiryDateSize: Integer;
pchIssuingAuthority: PChar;
var pnIssuingAuthoritySize: Integer): integer; {$IFDEF WIN32} stdcall {$ENDIF};

var
EidReadFixedPersonalDataP: function(pchPersonalNumber: PChar;
var pnPersonalNumberSize: Integer;
pchSurname: PChar;
var pnSurnameSize: Integer;
pchGivenName: PChar;
var pnGivenNameSize: Integer;
pchParentGivenName: PChar;
var pnParentGivenNameSize: Integer;
pchSex: PChar;
var pnSexSize: Integer;
_11: Char):integer; {$IFDEF WIN32} stdcall {$ENDIF};
var
EidReadVariablePersonalDataP: function(pchState: PChar;
var pnStateSize: Integer;
pchCommunity: PChar;
var pnCommunitySize: Integer;
pchPlace: PChar;
var pnPlaceSize: Integer;
pchStreet: PChar;
var pnStreetSize: Integer;
pchHouseNumber: PChar;
var pnHouseNumberSize: Integer;
pchHouseLetter: PChar;
var _12: Integer): integer; {$IFDEF WIN32} stdcall {$ENDIF};
var
EidReadPortraitP: function(var pchPortrait: BYTE;
var pnPortraitSize: Integer): integer; {$IFDEF WIN32} stdcall {$ENDIF};

procedure LoadDLL;
procedure NewExit; far;

{$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}
@EidReadDocumentDataP := GetProcAddress(DLLHandle,'EidReadDocumentDataP');
{$IFDEF WIN32}
Assert(@EidReadDocumentDataP <> nil);
{$ENDIF}
@EidReadFixedPersonalDataP := GetProcAddress(DLLHandle,'EidReadFixedPersonalDataP');
{$IFDEF WIN32}
Assert(@EidReadFixedPersonalDataP <> nil);
{$ENDIF}
@EidReadVariablePersonalDataP := GetProcAddress(DLLHandle,'EidReadVariablePersonalDataP');
{$IFDEF WIN32}
Assert(@EidReadVariablePersonalDataP <> nil);
{$ENDIF}
@EidReadPortraitP := GetProcAddress(DLLHandle,'EidReadPortraitP');
{$IFDEF WIN32}
Assert(@EidReadPortraitP <> 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.



[ dogriz @ 29.09.2010. 07:09 ] @
I ja sam ovo pokušao ali bez uspeha. Pokušao sam i sa alatima za konverziju, ali nisam dobio zadovoljavajuće rezultate. Nisam uspeo ni sa drugim API-jima za čitače kartica.
[ savkic @ 29.09.2010. 12:54 ] @
> Hvala, nisam ovako nesto radio, voleo bih neko od iskusnijih programera da prover ovaj kodi...

Za proveru bi trebalo probati a za to nema mogućnosti. Pre svega imaš užasno formatiranje koje otežava pregled i imaš dosta kondicionih direktiva (IFDEF WIN32).
Mogu ti reći da se npr:
char *Variable prevodi kao Variable: PChar
int *pnGivenNameSize prevodi kao Variable: PInteger ili var Variable: Integer, što i jeste kod tebe ali nisam svuda gledao. Trebaš proveriti da li recorde trebaš deklarisati sa packed record direktivom ili ne, to zavisi od alingmenta C kompajlera. Probaj prvo sa ovakvim pa ako ne ide probaj sa packed.
[ dogriz @ 30.09.2010. 06:53 ] @
Originalni izvor se nalazi na: http://www.mup.gov.rs/cms_lat/dokumenta.nsf/licna-karta-aplikacija.h, a drBob-ov konvertor uradi nešto ovako (što inače ne funkcioniše):
Code (delphi):

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.
 
[ xcsdsgn @ 30.09.2010. 12:23 ] @
Sta da se radi izlozio sam problem, hteo sam samostalno da odradim da nikoga ne zamaram ali nista od toga....

Probao sam i ja ali nista, valjda ce neko videti ovu temu i biti u domenu da pomogne koliko moze u svakom slucaju cekam neki odgovor koji ce resiti misteriju.
[ savkic @ 30.09.2010. 16:18 ] @
> Originalni izvor se nalazi na: http://www.mup.gov.rs/cms_lat/...a.nsf/licna-karta-aplikacija.h, a drBob-ov konvertor uradi nešto ovako (što inače ne funkcioniše):

Pa hajde dajte tačan opis šta ne funkcioniše, da li ste probali sa drugim konvertorima, da li ste ručno proverili sve deklaracije, da li ste proverili alingment (treba li packed record), koju grešku dobijate? Ja nemam čitač ni taj celik pa ne mogu licno probati.
[ xcsdsgn @ 30.09.2010. 18:30 ] @
Funkcije koje sam uspeo da resim su :



Greske:

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


//Api version je (1) = ok
function(nApiVersion: Integer):integer;

//Ok
function EidCleanup: integer;

//Saljem prazan string = ok
function(szReader: string):integer;

//Ok
function EidEndRead: integer;

/////////////////////////////////////
Ovde mi je najveci problem, kako da preuzmem podatke
a imam ovu funkciju

function EidReadDocumentData(var pData: EID_DOCUMENT_DATA):integer;;

a ona ima veze sa:

type
EID_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};





[ dogriz @ 01.10.2010. 08:13 ] @
Primer test projekta sa porukama o greškama (WinXP i D2006).
[ savkic @ 03.10.2010. 17:17 ] @
Ovako bi trebalo da izgleda.

Code:


unit CelikApi;

interface

uses
  Windows;

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

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

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

  EID_MAX_Portrait = 7700;

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

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};

 EID_DOCUMENT_DATA = tagEID_DOCUMENT_DATA;
 PEID_DOCUMENT_DATA = ^ tagEID_DOCUMENT_DATA;

type
  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Char;
    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};

 EID_FIXED_PERSONAL_DATA = tagEID_FIXED_PERSONAL_DATA;
 PEID_FIXED_PERSONAL_DATA = ^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};

  EID_VARIABLE_PERSONAL_DATA = tagEID_VARIABLE_PERSONAL_DATA;
  PEID_VARIABLE_PERSONAL_DATA = ^tagEID_VARIABLE_PERSONAL_DATA;

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

  EID_PORTRAIT = tagEID_PORTRAIT;
  PEID_PORTRAIT = ^tagEID_PORTRAIT;

var
  EidStartup: function(nApiVersion: Integer): Integer; stdcall;
  EidCleanup: function: Integer; stdcall;

  EidBeginRead: function(szReader: LPCSTR): Integer; stdcall;
  EidEndRead: function: Integer; stdcall;

  EidReadDocumentData: function(pData: PEID_DOCUMENT_DATA): Integer; stdcall;
  EidReadFixedPersonalData: function(pData: PEID_FIXED_PERSONAL_DATA): Integer; stdcall;
  EidReadVariablePersonalData: function(pData: PEID_VARIABLE_PERSONAL_DATA): Integer; stdcall;
  EidReadPortrait: function(pData: PEID_PORTRAIT): Integer; stdcall;

implementation

var
  DLLHandle: HMODULE;

procedure LoadDLL;
begin
  DLLHandle := LoadLibrary('CelikApi.dll');

  if DLLHandle <> 0 then
  begin
    @EidStartup := GetProcAddress(DLLHandle, 'EidStartup');
    @EidCleanup := GetProcAddress(DLLHandle, 'EidCleanup');
    @EidBeginRead := GetProcAddress(DLLHandle, 'EidBeginRead');
    @EidEndRead := GetProcAddress(DLLHandle, 'EidEndRead');
    @EidReadDocumentData := GetProcAddress(DLLHandle, 'EidReadDocumentData');
    @EidReadFixedPersonalData := GetProcAddress(DLLHandle, 'EidReadFixedPersonalData');
    @EidReadVariablePersonalData := GetProcAddress(DLLHandle, 'EidReadVariablePersonalData');
    @EidReadPortrait := GetProcAddress(DLLHandle, 'EidReadPortrait');
  end;
end;

initialization
  LoadDLL;

finalization
  if DLLHandle <> 0 then
    FreeLibrary(DLLHandle)

end.



[Ovu poruku je menjao savkic dana 05.10.2010. u 16:53 GMT+1]
[ xcsdsgn @ 03.10.2010. 19:16 ] @
Igore hvala, funkcionise ali imam problema sa packed record.

Kako ova funkcija treba da se upotrebi i da vrati rezultat ?



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};

EID_DOCUMENT_DATA = tagEID_DOCUMENT_DATA;
PEID_DOCUMENT_DATA = ^ tagEID_DOCUMENT_DATA;
//Ova funkcija cita podatke sa licne karte
EidReadDocumentData: function(pData: PEID_DOCUMENT_DATA): Integer; stdcall;
[ savkic @ 03.10.2010. 20:22 ] @
> Igore hvala, funkcionise ali imam problema sa packed record.

Koji problem?

> Kako ova funkcija treba da se upotrebi i da vrati rezultat ?

To ne znam, moraš videti u uputstvu ako postoji ili pogledaj diskusije na ovu temu u C++ grupi.

> //Ova funkcija cita podatke sa licne karte
> EidReadDocumentData: function(pData: PEID_DOCUMENT_DATA): Integer; stdcall;

Code:

var
  Data: EID_DOCUMENT_DATA;
begin
  EidReadDocumentData(@Data); // Ti vidi postoje li neki posebni uslovi kako se poziva ta funkcija i da li se prosleđeni record (Data) mora inicijalizovati
end;


[Ovu poruku je menjao savkic dana 04.10.2010. u 02:11 GMT+1]
[ dogriz @ 04.10.2010. 10:28 ] @
Uz Savkićevu pomoć u prevodu API-ja, evo i primera za xcsdsgn:
Code (delphi):

procedure TForm1.Button1Click(Sender: TObject);
var
  PodaciOLK: EID_DOCUMENT_DATA;
  NepromenljiviPodaci: EID_FIXED_PERSONAL_DATA;
  PromenljiviPodaci: EID_VARIABLE_PERSONAL_DATA;
begin
  EidStartup(1);
  EidBeginRead('');
  EidReadDocumentData(@PodaciOLK);
  EidReadFixedPersonalData(@NepromenljiviPodaci);
  EidReadVariablePersonalData(@PromenljiviPodaci);
  EidEndRead;
  EidCleanup;
  Memo1.Clear;
  Memo1.Lines.Add('Reg.no: ' + PodaciOLK.docRegNo);
  Memo1.Lines.Add('Datum izdavanja: ' + PodaciOLK.issuingDate);
  Memo1.Lines.Add('Datum isteka: ' + PodaciOLK.expiryDate);
  Memo1.Lines.Add('Izdaje: ' + PodaciOLK.issuingAuthority);
  Memo1.Lines.Add('Prezime: ' + NepromenljiviPodaci.surname);
  Memo1.Lines.Add('Ime: ' + NepromenljiviPodaci.givenName);
  Memo1.Lines.Add('Prebivaliste - oznaka drzave: ' + PromenljiviPodaci.state);
  Memo1.Lines.Add('Prebivaliste - opstina: ' + PromenljiviPodaci.community);
  Memo1.Lines.Add('Prebivaliste - mesto: ' + PromenljiviPodaci.place);
  Memo1.Lines.Add('Prebivaliste - ulica: ' + PromenljiviPodaci.street);
end;
 

Sledeći problem je ćirilični upis podataka na LK. Ja koristim D2006 i ne mogu da pročitam ćirilične podatke (UTF-8).
[ savkic @ 04.10.2010. 12:11 ] @
> Sledeći problem je ćirilični upis podataka na LK. Ja koristim D2006 i ne mogu da pročitam ćirilične podatke (UTF-8).

Zašto? Da li si uradio konverziju dobijenih UTF8 stringova u WideString (recimo preko Utf8Decode)?
[ dogriz @ 04.10.2010. 12:37 ] @
Citat:
savkic:Zašto? Da li si uradio konverziju dobijenih UTF8 stringova u WideString (recimo preko Utf8Decode)?
Mislim da je problem u onom CELIK-API-ju, tamo su uglavnom svi elementi recorda tipa Char, tako da pretpostavljam da iščitavanje podataka preko prevedenih funkcija sa kartice ne valja, a samim tim ni dobijeni stringovi nisu ispravni, pa naknadna konverzija sa Utf8Decode nema smisla.
Evo i printScreen-a:
[att_img]
[ xcsdsgn @ 04.10.2010. 12:56 ] @
I kod mene isto, bedak
[ tkaranovic @ 04.10.2010. 14:47 ] @
Nemam čitač da probam a ovo uz poruku je kompajlirano sa D2010. Kod je ovaj koji poslat ovde.
Šta ispiše?
[ xcsdsgn @ 04.10.2010. 15:34 ] @
Poruka za TKaranovic....


Probacu sutra tvoj projekat, ja posteno nisam uspeo.
Kada hocu da prevedem utf8tostr vraca mi karakuke.....
[ savkic @ 04.10.2010. 16:18 ] @
> EidStartup(1);
> EidCleanup

Ti pozivaš svaki put, oni se moraju pozvati samo jednom, najbolje na početku rada programa i na kraju. Takođe pre poziva funkcije resetuj record npr:
FillChar(PodaciOLK, SizeOf(PodaciOLK), 0);

> Mislim da je problem u onom CELIK-API-ju,

BTW, postoji novija verzija dlla, svakako probaj sa njom.

> tamo su uglavnom svi elementi recorda tipa Char,

Kakve to ima veze?

> samim tim ni dobijeni stringovi nisu ispravni, pa naknadna konverzija sa Utf8Decode nema smisla.

Ubaci snimanje i učitavanje pročitanih recorda (izbriši bitne stvari) u neki stream pa pošalji čitav kod sa snimljenim podacima da mogu pogledati.

[Ovu poruku je menjao savkic dana 04.10.2010. u 17:28 GMT+1]
[ dogriz @ 05.10.2010. 07:50 ] @
Citat:
tkaranovic: Nemam čitač da probam a ovo uz poruku je kompajlirano sa D2010. Kod je ovaj koji poslat ovde.
Šta ispiše?
Ispiše "Access violation at address 00000000. Read of address 00000000".
[ dogriz @ 05.10.2010. 07:54 ] @
Citat:
savkic: > EidStartup(1);
> EidCleanup

Ti pozivaš svaki put, oni se moraju pozvati samo jednom, najbolje na početku rada programa i na kraju. Takođe pre poziva funkcije resetuj record npr:
FillChar(PodaciOLK, SizeOf(PodaciOLK), 0);

Što se tiče pozivanja EidStartup i Cleanup si u pravu, kod koji sam napisao je samo radi probe, u realnom projektu svakako treba da se poziva samo jednom.
Citat:
savkic: > Mislim da je problem u onom CELIK-API-ju,
BTW, postoji novija verzija dlla, svakako probaj sa njom.

Koliko vidim poslednja verzija dll-a je 1.0.1.0, bar je ta okačena na sajtu MUP-a.

Citat:
savkic: > tamo su uglavnom svi elementi recorda tipa Char,

Kakve to ima veze?

> samim tim ni dobijeni stringovi nisu ispravni, pa naknadna konverzija sa Utf8Decode nema smisla.

Pošto koristim D2006 koji ne radi sa unicode-om, a na LK su podaci upisani ćirilicom, pitanje je šta se zapravo upisuje u non-unicode Char recorde (npr. NepromenljiviPodaci.surname)?
Inače u okačenom primeru se vidi da iščitavanje podataka o LK i promenljivih podataka nije problem, pošto su upisani latinicom, a greška je samo kod nepromenljivih podataka o licu koji su upisani ćirilicom.

Na kraju evo i primera sa sačuvanim ispisom podataka o LK u text fajlu.
[ tkaranovic @ 05.10.2010. 08:10 ] @
Citat:
dogriz
Ispiše "Access violation at address 00000000. Read of address 00000000".


To ispiše kada CelikAPIProject nije u istom diru sa celikapi.dll.
[ dogriz @ 05.10.2010. 09:42 ] @
Citat:
tkaranovic: To ispiše kada CelikAPIProject nije u istom diru sa celikapi.dll.

My bad. Evo ispisa sa dll fajlom u istom diru.
[att_img]
[ tkaranovic @ 05.10.2010. 10:28 ] @
Pogrešne su dužine te koje su ispisane:
NepromenljiviPodaci.personalNumberSize: dužine 0
NepromenljiviPodaci.surnameSize: dužine 0
NepromenljiviPodaci.givenNameSize: prevelike dužine, zbog čega je i ta greška.

Inače je do te greške u dužinama došlo kod onog automatskog prevoda:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Integer;

treba:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Char;

ili za d2010:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of AnsiChar;

Nisi probao šta kod tebe ispiše, a mogao bi da probaš sa ovom izmenom gore:
Code:

  Memo1.Lines.Add('personalNumberSize: ' + IntToStr
     (NepromenljiviPodaci.personalNumberSize));
  Memo1.Lines.Add('Prezime size: ' + IntToStr(NepromenljiviPodaci.surnameSize));
  Memo1.Lines.Add('Ime size: ' + IntToStr(NepromenljiviPodaci.givenNameSize));

To je i provera koliko su tačno preneti podaci.
[ dogriz @ 05.10.2010. 11:31 ] @
Citat:
tkaranovic: Pogrešne su dužine te koje su ispisane:
NepromenljiviPodaci.personalNumberSize: dužine 0
NepromenljiviPodaci.surnameSize: dužine 0
NepromenljiviPodaci.givenNameSize: prevelike dužine, zbog čega je i ta greška.

Inače je do te greške u dužinama došlo kod onog automatskog prevoda:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Integer;

treba:
Code:

  tagEID_FIXED_PERSONAL_DATA = record
    personalNumber: array[0..EID_MAX_PersonalNumber - 1] of Char;

Sjajno, to je bio problem, sada iščitava podatke kako treba.

Jedino preostaje problem prikaza ćiriličnog imena i prezimena (na slici).

[att_img]
Code (delphi):

  Memo1.Lines.Add('Prezime: ' + (NepromenljiviPodaci.surname));
  Memo1.Lines.Add('Prezime size: ' + IntToStr(NepromenljiviPodaci.surnameSize));
  Memo1.Lines.Add('Ime: ' + (NepromenljiviPodaci.givenName));
  Memo1.Lines.Add('Ime size: ' + IntToStr(NepromenljiviPodaci.givenNameSize));
 


Dužinu daje dobro (2 bajta za svako slovo), ali je ispis nečitljiv.

Ako odradim konverziju sa Utf8Decode umesto prikazanih kvakica sa slike, dobijem samo upitnike ("?????????????").
[ tkaranovic @ 05.10.2010. 17:41 ] @
Kako inače prikazuješ/koristiš ćirilicu?

Trebalo bi da imaš neko trajnije rešenje ili ako nećeš da imaš onda moraš konvertovati ćirilicu u latinicu pa tako prikazati.
Evo jednog jednostavnog rešenja za prikazati ćirilicu:
Code:

...neki klik
 var
   S: AnsiString; // UTF8String;
  function WStrToAStr(const s: WideString; const CodePage: Word = CP_ACP): AnsiString;
  var
    InputLength, OutputLength: Integer;
  begin
    InputLength := Length(s);
    OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(s), InputLength, nil, 0, nil, nil);
    SetLength(Result, OutputLength);
    WideCharToMultiByte(CodePage, 0, PWideChar(s), InputLength, PAnsiChar(Result), OutputLength, nil, nil);
  end;
begin
  S := #209#130#208#186#208#176#209#128#208#176#208#189#208#190#208#178#208#184#209#134;
  //S je ut8 cirilicni string
  label1.Font.Charset := 204; //RUSSIAN_CHARSET iliti Cyrillic
  label1.Caption := WStrToAStr(Utf8Decode(S), 1251); //uf8->unicod->ansiCP1251  CP1251 - Cyrillic
end;

Može i da se prethodno izabere ćirlični font za label1.

Umesto S iz primera moze da bude ime ili prezime, šta je već tu ćirilično.
[ savkic @ 05.10.2010. 18:06 ] @
> Koliko vidim poslednja verzija dll-a je 1.0.1.0, bar je ta okačena na sajtu MUP-a.

http://ca.mup.gov.rs/download.html.

Izmenio sam CelikApi i dodao nove funkcije.

> Pošto koristim D2006 koji ne radi sa unicode-om, a na LK su podaci upisani ćirilicom, pitanje je šta se zapravo upisuje u non-unicode Char recorde (npr. NepromenljiviPodaci.surname)?

Sadržaj u UTF8 formatu.

> Inače u okačenom primeru se vidi da iščitavanje podataka o LK i promenljivih podataka nije problem, pošto su upisani latinicom, a greška je samo kod nepromenljivih podataka
> o licu koji su upisani ćirilicom.

Da bi prikazao i latinicu i ćirilicu u kontroli moraš koristiti unicode kontrolu, dakle ili ti treba neki novi Delphi ili Tnt kontrola. Ja sam uzeo Tnt kontrolu jer će to rešenje raditi i na D7.

> Na kraju evo i primera sa sačuvanim ispisom podataka o LK u text fajlu.

To ništa ne znači, moraš snimiti raw podatke, šaljem primer.
Bilo bi dobro da neko proba i ove nove funkcije (EidReadDocumentData, PEidReadFixedPersonalDataP...).
[ xcsdsgn @ 06.10.2010. 07:41 ] @
Bravo, podaci se uspesno iscitavaju, a sad jos jedno pitanje postoji i slika tj. Portrait kako do nje doci.....




[ dogriz @ 06.10.2010. 11:23 ] @
Evo zapažanja:

Delphi 2006 i TNT Unicode kontrole

NormReadDocumentData, NormReadFixedPersonalData i NormReadVariablePersonalData rade savršeno.
EidReadDocumentData, EidReadFixedPersonalData i EidReadVariablePersonalData prikazuju dobro sve osim prezimena i imena, gde se kuke i kvake i dalje prikazuju. (TntMemo)


Delphi 2010 (Trial) bez korišćenja TNT Unicode kontrola

NormReadDocumentData, NormReadFixedPersonalData i NormReadVariablePersonalData rade savršeno. (TMemo)
EidReadDocumentData, EidReadFixedPersonalData i EidReadVariablePersonalData prikazuju dobro sve osim prezimena i imena, gde se kuke i kvake i dalje prikazuju. (TMemo)

Btw, Savkiću, mislim da je
Code (delphi):

uses
  JclUnicode;
 
nepotrebno (u poslednjem CelikApiTest primeru).
[ staleks @ 06.10.2010. 11:44 ] @
pozzz,

oduvek me je zanimalo da izadjem iz okvira programa informacionih sistema, odnosno da probam da software integrisem sa nekim hardwareom.

Ovo mi zvuci jako zanimljivo pre svega sa stanovista upotrebe. padaju mi razne ideje na pamet, recimo autentifikacija korisnika za koriscenje neke applikacije na osnovu LK. pa vec mora da je nosi, onda nek je i iskoristi za nesto pametno :)


Da li moze neko da mi kaze koji hardware koristite, gde moze da se nabavi, neke cene ? Iskustva ?

Hvala unapred.
[ xcsdsgn @ 06.10.2010. 12:03 ] @
Pozdrav za staleks....

Ja koristim PC Twin reader, iskreno ne znam gde je kupljen ali gde god ima prodavnica racunarskih komponenti mozete kupiti i citac smart kartice.U svakom slucaju potrebno je da imas Hardver tj. Smart card reader, Driver, i celikapi.dll sa sajta MUP srbije.U Windowsu moras da pokrenes servis Smartcard i to je to.


Pozdrav naravno i vama savkic, tkaranovic ... koji ste obogatili odgovorima ovu temu
[ savkic @ 06.10.2010. 15:46 ] @
> NormReadDocumentData, NormReadFixedPersonalData i NormReadVariablePersonalData rade savršeno. (TMemo)
> EidReadDocumentData, EidReadFixedPersonalData i EidReadVariablePersonalData prikazuju dobro sve osim prezimena i imena, gde se kuke i kvake i dalje prikazuju. (TMemo)

Ti onda ne konvertuješ dobro dobijeni tekst, pogledaj moje funkcije (NormXXX) i vidi kako je u njima urađeno. Takođe probaj ove funkcije bez struktura (EidReadDocumentDataP...)

> Bravo, podaci se uspesno iscitavaju, a sad jos jedno pitanje postoji i slika tj. Portrait kako do nje doci.....

Pogledaj u dokumentaciji u kom je formatu ta slika, ti ćeš dobiti niz bajtova posle poziva EidReadPortrait.
[ xcsdsgn @ 06.10.2010. 15:56 ] @
Slika je u JPG formatu....
[ savkic @ 06.10.2010. 18:44 ] @
> Slika je u JPG formatu....

Pa onda preuzmi bajtove i snimi u neki fajl (koristi TFileStream, imaš primer kako se radi sa njim u onom mom testu).
[ dogriz @ 07.10.2010. 06:41 ] @
Citat:
savkic:Ti onda ne konvertuješ dobro dobijeni tekst, pogledaj moje funkcije (NormXXX) i vidi kako je u njima urađeno. Takođe probaj ove funkcije bez struktura (EidReadDocumentDataP...)

Nisam ništa konvertovao, samo sam iskoristio tvoj demo primer i u slučaju D2010 umesto TntMemo-a stavio običan Memo.

Za xcsdsgn - kod za čitanje slike sa LK:
Code (delphi):

procedure TForm1.btnSaveImageClick(Sender: TObject);
var
  Slika: TEidPortrait;
  f: TFileStream;
begin
  FillChar(Slika, SizeOf(TEidPortrait), 0);

  EidBeginRead('');
  EidReadPortrait(@Slika);
  EidEndRead;

  f := TFileStream.Create('Slika.jpg', fmCreate);
  try
    f.Write(Slika, SizeOf(TEidPortrait));
  finally
    f.Free;
  end;
end;
 


[Ovu poruku je menjao dogriz dana 07.10.2010. u 10:56 GMT+1]
[ xcsdsgn @ 07.10.2010. 07:50 ] @
Radi dogriz ....Cool
[ manem78 @ 13.12.2010. 09:47 ] @
Pozdrav! Da se i ja prikljucim diskusiji. Imam jedan problem. Sto se citanja licnih karti iz Deplhija sve radi besprekorno. Medjutim ja koristim Delphi kako COM client za .NET aplikaciju. U Delphiju je implementiran rad sa Celikom, a iz .NET aplikacije pozivam proceduru za citanje licne karte iz COM-a. Kad testiram iz Delphija sve radi super, ali kad testiram iz VS2008 ili iz runtime-a Celik mi baca gresku EID_E_CARD_MISSING. Ima li neko ideju sta moze da bude problem? Hvala!
[ manem78 @ 13.12.2010. 11:11 ] @
Resio sam tako sto vrtim svaki korak dok ne istera EID_OK ili dok ne bude broj pokusaja 5. Uglavnom iz drugog pokusaja uspe tako da radi dovoljno dobro :)