Nadam se da ima ljudi koji su i dalje prisutni, a mogu da mi pomognu.
Treba da napravim C# aplikaciju koja ce da cita podatke sa LK koristeci Celik API. Trenutno sam u fazi pravljenja wrapper-a.
Pokusao sam da upotrebim sve sto je ovde receno, koristio sam i net, ali ne uspevam. Istovremeno, program Celik radi sasvim normalno, na istom racunaru (Windows XP SP2). Uradio sam i uninstall .net framework 3.5 SP1. Koristim VS2005.
Sta je problem:
Vec na EidBeginRead se javlja "Microsoft C++ exception: CardException at memory location 0x00138270". Na netu kazu da moze da se ignorise?
Na EidReadFixedPersonalData (a i sve ostale): "Microsoft C++ exception: unsigned long at memory location 0x00138818" i to dvaput (uzastopno)
Posle toga (jos uvek na EidReadFixedPersonalData ili bilo koji drugi metod): "Access violation writing location".
Na kraju: "An unhandled exception of type 'System.ExecutionEngineException' occurred in System.Windows.Forms.dll" (probao da stavim try/catch, ali dzaba)
Inace, pre Access violation, sistem definitivno cita podatke, jer na citacu pocne da blinka lampica, ali onda sve pukne, reklo bi se kad procitane podatke treba da upise nazad meni u prosledjenu klasu. Probao sam da koristim MarshallAs i MarshallAsAttribute. Probao sa LPStr i ByValTStr, ali stalno isto. Nekako zakljucujem da je problem u pointerima ili tipovima, ali nikako ne uspevam da nadjem problem. Ni da ga resim.
Stavio sam da se EidStartup poziva samo na pocetku. EidCleanup samo na kraju. Izmedju pozivam.. pa evo cele klase:
Code:
public partial class Form1 : Form
{
int ret;
public Form1()
{
InitializeComponent();
}
[SecurityPermission(SecurityAction.Assert, UnmanagedCode = true)]
private void button1_Click(object sender, EventArgs e)
{
ret = Celik.EidBeginRead("");
if (ret < 0)
{
// Nije ni bitno, nikad ne udje ovde
}
Celik.tagEID_FIXED_PERSONAL_DATA podaci = new Celik.tagEID_FIXED_PERSONAL_DATA();
try
{
ret = Celik.EidReadFixedPersonalData(ref podaci);
}
catch (Exception ex)
{
int a = 5;
}
if (ret < 0)
{
MessageBox.Show(((enmCelikStatus)ret).ToString(), "Greska", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Celik.EidEndRead();
return;
}
}
Zakljucujuem da je probem u klasi Celik:
Code:
[SuppressUnmanagedCodeSecurity()]
public class Celik
{
//
// 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;
//
// Functions
//
[DllImport("CelikApi.dll", CharSet = CharSet.Unicode)]
public static extern int EidStartup(
int nApiVersion
);
[DllImport("CelikApi.dll", EntryPoint = "EidCleanup", CharSet = CharSet.Unicode)]
public static extern int EidCleanup(
);
[DllImport("CelikApi.dll", CharSet = CharSet.Unicode)]
public static extern int EidBeginRead(
[MarshalAs(UnmanagedType.LPStr)] String szReader
);
[DllImport("CelikApi.dll", CharSet = CharSet.Unicode)]
public static extern int EidEndRead(
);
[DllImport("CelikApi.dll", CharSet = CharSet.Unicode)]
public static extern int EidReadFixedPersonalData(
ref tagEID_FIXED_PERSONAL_DATA pData
);
[DllImport("CelikApi.dll", CharSet = CharSet.Unicode)]
public static extern int EidReadDocumentData(
ref tagEID_DOCUMENT_DATA pData
);
[DllImport("CelikApi.dll", CharSet = CharSet.Unicode)]
public static extern int EidReadPortrait(
ref tagEID_PORTRAIT pData
);
//
// Classes
//
[StructLayout(LayoutKind.Sequential, Size = EID_MAX_IssuingAuthority + EID_MAX_IssuingDate + EID_MAX_DocRegNo + EID_MAX_ExpiryDate), Serializable]
public class tagEID_DOCUMENT_DATA
{
[MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = EID_MAX_DocRegNo)]
public string docRegNo;
public int docRegNoSize;
[MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = EID_MAX_IssuingDate)]
public string issuingDate;
public int issuingDateSize;
[MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = EID_MAX_ExpiryDate)]
public string expiryDate;
public int expiryDateSize;
[MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = EID_MAX_IssuingAuthority)]
public string issuingAuthority;
public int issuingAuthoritySize;
};
[StructLayout(LayoutKind.Sequential, Size = EID_MAX_PersonalNumber + EID_MAX_Surname + EID_MAX_GivenName + EID_MAX_Sex + EID_MAX_PlaceOfBirth + EID_MAX_StateOfBirth + EID_MAX_DateOfBirth + EID_MAX_CommunityOfBirth), Serializable]
public class tagEID_FIXED_PERSONAL_DATA
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_PersonalNumber)]
public string personalNumber;
public int personalNumberSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_Surname)]
public string surname;
public int surnameSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_GivenName)]
public string givenName;
public int givenNameSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_Sex)]
public string sex;
public int sexSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_PlaceOfBirth)]
public string placeOfBirth;
public int placeOfBirthSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_StateOfBirth)]
public string stateOfBirth;
public int stateOfBirthSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_DateOfBirth)]
public string dateOfBirth;
public int dateOfBirthSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = EID_MAX_CommunityOfBirth)]
public string communityOfBirth;
public int communityOfBirthSize;
};
[StructLayout(LayoutKind.Sequential, Size = EID_MAX_Portrait), Serializable]
public class tagEID_PORTRAIT
{
[MarshalAs(UnmanagedType.LPStr, SizeConst = EID_MAX_Portrait)]
public string portrait;
public int portraitSize;
};
}
public enum enmCelikStatus
{
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
};
Svaka ideja/pomoc dobrodosla.