Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Korišćenje dll-a i .h datoteka pisanih u C-u

[es] :: .NET :: Korišćenje dll-a i .h datoteka pisanih u C-u

Strane: 1 2

[ Pregleda: 7430 | Odgovora: 36 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Korišćenje dll-a i .h datoteka pisanih u C-u18.11.2010. u 11:27 - pre 163 meseci
OK, jasno mi je kako da uključim C-ovsku funkciju iz DLL-a (DLLImport), ali ne znam kako da uključim strukture koje su definisane u .h datoteci.
U toj .h datoteci su deklarisane sve konstante, promenljive, strukture i funkcije. Funkcije koriste strukture kao ulazno-izlazne argumente.

Ima li neko ideju kako se ovo koristi, mislim da mi fali dosta znanja kako se bezbedno "šeta" iz managed koda u unmanaged kod.

Konkretno, želim da koristim API za čitanje elektronske lične karte ("CelikAPI.dll") koji je pisan u C-u, a želim da ga koristim u C#-u.
A vi,kako 'te?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u18.11.2010. u 11:38 - pre 163 meseci
moraces isto sam da definises strukture kroz marshalling.

pocni odavde
http://msdn.microsoft.com/en-us/library/ef4c3t39.aspx

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u19.11.2010. u 14:06 - pre 163 meseci
Kaže mi da "signature" moje i C-ovske strukture nisu isti, u strukturi u C-u imam char[], možda mu to smeta, probao sam to da mapiram u string ali ništa.
A vi,kako 'te?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u19.11.2010. u 15:20 - pre 163 meseci
Ko ti kaze?


ok, strignove marsalujes sa [MarshalAs(UnmanagedType.LPTStr)] atributom a deklarises kao string ili kao StringBuilder (u zavisnosti dal modifikujes ili samo citas string)

ne zabroavi da stavis CharSet = CharSet.Ansi u DllImport


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 09:38 - pre 163 meseci
Miljane, vidim da se razumeš prilično dobro i u ovo, pa ako možeš malo da mi pomogneš. Evo greške:

A call to PInvoke function 'CELIK_API!CELIK_API.Form1::EidReadFixedPersonalData' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

Ovo je nakon nekoliko pokušaja da napišem strukturu, ali ne znam gde šta ide.
Evo jedne od struktura koje se tamo koriste, ovo je iz .h datoteke:
Code:

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;


Ovo je test koji puca nakon poziva druge funkcije:
Code:

        [DllImport("CelikApi.dll", CharSet=CharSet.Ansi)]
        public static extern int EidStartup(int nApiVersion);
        [DllImport("CelikApi.dll", CharSet = CharSet.Ansi)]
        public static extern int EidReadFixedPersonalData(LicniPodaci pData);

        public Form1()
        {
            InitializeComponent();
            int i = EidStartup(1); // ovo radi
            LicniPodaci pData = new LicniPodaci();
            EidReadFixedPersonalData(pData); // ovde prikazuje onu gresku
            string test = pData.communityOfBirth;
        }

A ovo je struktura iz poslednjeg pokušaja:
Code:

[StructLayout(LayoutKind.Sequential)]
    public struct LicniPodaci
    {
        [MarshalAs(UnmanagedType.LPTStr)]
        public string personalNumber;
        public int personalNumberSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string surname;
        public int surnameSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string givenName;
        public int givenNameSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string parentGivenName;
        public int parentGivenNameSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string sex;
        public int sexSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string placeOfBirth;
        public int placeOfBirthSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string stateOfBirth;
        public int stateOfBirthSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string dateOfBirth;
        public int dateOfBirthSize;
        [MarshalAs(UnmanagedType.LPTStr)]
        public string communityOfBirth;
        public int communityOfBirthSize; 
    }

A mogu da pošaljem i ceo .h fajl, pa da sve razjasnimo...
A vi,kako 'te?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 12:41 - pre 163 meseci
Problem ti je sa char[xxx] deloima strukture, ti ih marshalujes kao pointere (4byte) umesto kao niz

takvi nizovi se marshaluju sa

Code (csharp):

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = <vrednost EID_MAX_PersonalNumber>)]
public string personalNumber;

... // svi ostali char[xxx] isto tako
 


Imas ovde vise informacija o nacinima da marshalujes razlicite forme stringova: Default Marshaling for Strings
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 12:52 - pre 163 meseci
Ipak sam uspeo da pročitam. Evo dela strukture, ovako je uspelo:

Code:

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct LicniPodaci
    {
        [MarshalAs(UnmanagedType.ByValTStr,SizeConst=14)]
        public string personalNumber;
        public int personalNumberSize;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 60)]
        public string surname;
        public int surnameSize;



Ovo su deklaracije funkcija:
Code:

       [DllImport("CelikApi.dll")]
        public static extern int EidStartup(int nApiVersion);
        [DllImport("CelikApi.dll",CharSet = CharSet.Auto)]  // nije htelo ni kada stoji ANSI, niti kada ne stoji ništa
        public static extern int EidReadFixedPersonalData([Out] out LicniPodaci pData);
        [DllImport("CelikApi.dll")]
        public static extern int EidBeginRead([MarshalAs(UnmanagedType.LPTStr)] string szReader);
        [DllImport("CelikApi.dll")]
        public static extern int EidEndRead();
        [DllImport("CelikApi.dll")]
        public static extern int EidCleanup();


Sada imam problem sa ćirilicom: Ime i prezime mi je na ćirilici (to se loše prikaže), dok je ostalo na latinici (a to se dobro prikaže).
Probao sam sa Encode.Convert, nekoliko kombinacija, ali nikad ne dobijam ono što treba.
Recimo ime mi prikaže ovako: ВЛАДИМИР
Kao što se gore u kodu vidi, morao sam da stavim da mi je JMBG dužina 14 a ne 13, jer nije hteo da mi pročita poslednju cifru, a tako isto i za datum. Ne znam ima li ovo veze sa ćirilicom, tj. da li postoji međusobni uticaj dužina polja u strukturi?


[Ovu poruku je menjao vbvlada dana 22.11.2010. u 14:03 GMT+1]
A vi,kako 'te?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 13:47 - pre 163 meseci
Nemam preterano iskustva sa maršalovanjem, a i ono što imam je umočeno u gorki sirup, ali poslušaj šta će ti ovaj starac reći. Neka struktura nema string nego byte[]:

Code:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct LicniPodaci
{
  [MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.U8, USizeConst=14)]
  public byte[] personalNumber_Marshalled;
  public int personalNumberSize;

  public string personalNumber
  {
    get { return Encoding.UTF8.GetString(personalNumber_Marshalled, 0, personalNumberSize); }
  }
}


[Ovu poruku je menjao Mihajlo Cvetanović dana 22.11.2010. u 15:07 GMT+1]
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 14:04 - pre 163 meseci
Iskreno koliko vidim po problematici koju si izneo, celikovci su sje*ali konvenciju, njihovi char[] nisu null terminated stringovi vec prosti char buferi, bolje je da iskoristis pristup koji ti je dao Mihajlo, nemoj stavljati 14 tamo gde je 13 remetis poredak podataka posle. Ili to ili da pises C++/CLI wrapper

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 14:10 - pre 163 meseci
Svaka čast!
Skroz logično i radi :)
Hvala puno!
A vi,kako 'te?
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 14:49 - pre 163 meseci
Odradio sam po Mihajlovom predlogu, ok je.
Imao sam još jednu strukturu koja u C-u ima polje byte[].
Ovamo sam je maršalovao kao
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U8, SizeConst = size+1)], kao što vidite i ovde sam morao da dodam još 1, jer je ponovo pucalo, mada ovde možda nisam pogodio tip...

Ovo je super stvar, samo da se savlada, mada vidim da mi fali dosta znanja iz tih stvari koje se nalaze ispod površine...
A vi,kako 'te?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 15:05 - pre 163 meseci
Moguće je da ta dodatna C struktura nije definisana sa pakovanjem članova na prvi bajt nego na ofsete deljive sa 4 (to jest struktura nije unutar #pragma pack(push, 1) / #pragma pack(pop) direktiva). U tom slučaju dolazi do popunjavanja (padding) međuprostora bajtovima, što praktično dovodi do toga da se nizovi produžuju do prvog sledećeg broja deljivog sa 4.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u22.11.2010. u 15:10 - pre 163 meseci
Nema pragma pack

Iskreno, ja bi ovo odradio kao C++/CLI wapper assembly. Nema puno posla a trajno bi resilo problem svima, uradio bi vam to ali ne mogu da testiram, nemam cipovanu licnu kartu :)
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u23.11.2010. u 09:25 - pre 163 meseci
Ja se stvarno ne razumem u ove stvari, C sam samo protrčao školski, pa se borim da razumem sve što pišete, a vama svaka čast :)
Mislio sam da mi ovaj test program sada radi, međutim, radio je ok samo u Debug-u. Imam dve strukture sa podacima, a jednu neće da mi pročita kada nije u Debug-u.
Mmix, ja imam volju da zajedno odradimo ovo po tvom predlogu. Imam čitač i l.k. sa čipom, a mogu da ih nađem još od kolega.
Pa ako ste za, možemo ovo da sredimo, stvarno bi bilo korisno da imamo gotov kod za korišćenje, a ne da se ovako svako ponaosob muči.
A vi,kako 'te?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u23.11.2010. u 09:38 - pre 163 meseci
Stize mi veceras licna karta od sestre pa cu odraditi sutra ujutro. Vidim da vec ima nekoliko vas koji se patite sa time a bice vas jos vise kako se LK budu masovnije citale, uradicu wrapper pa cu okaciti.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u23.11.2010. u 09:56 - pre 163 meseci
Super!
Računam da ću iz toga da provalim kako se pišu ti wrapperi.

Šta je još zanimljivo: U ovom API-u nema čitanja email-a i bračnog statusa, a kolega mi reče da je bio u Vip-u i da su oni izvukli i te podatke.

Ja sam malo prerano postavio temu, jer je jedna bila već postavljena za ovaj CelikAPI, a tamo je neko rekao da API koristi neki Windows-ov dll, čini mi se scard.dll. Ima li svrhe da istražujemo i u tom pravcu?
Meni bi dosta značilo da pročitam i mail (broj telefona ako ima), mada se ja uopšte ne sećam da sam davao mail kada sam vadio l.k.
A vi,kako 'te?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u23.11.2010. u 10:06 - pre 163 meseci
Ja koliko znam mail nema, ne verujem ni da telefon ima. Ali moguce je da apliakcija VIPa kombinuje LK i unete podatke da odstampa onaj list.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbvlada
Petrović Vladimir
Beograd

Član broj: 59233
Poruke: 209
*.viser.edu.rs.



Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u23.11.2010. u 10:16 - pre 163 meseci
Ne znam, ni meni nije poznato za mail, ali tako mi kolega reče, možda nije lepo video. Ok, do sutra onda :)
A vi,kako 'te?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u23.11.2010. u 20:01 - pre 163 meseci
Nije uopste tesko, vec sam izvukao image u Bitmap i fixed personal, odradio sam i disposable patern i skrivenu globalnu inicijalizaciju i cleanup. Visok stepen apstrakcije, sto bi rekli
Da odradim ujutro i variable i documents pa cu okaciti sors svega



*jmbg je tu al nije za javnost
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
Prikačeni fajlovi
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Korišćenje dll-a i .h datoteka pisanih u C-u24.11.2010. u 10:26 - pre 163 meseci
Ok, mali test, imam neki problem al ne znam dal je do mog drajvera ili do implemetnacije.

Prikacen je primer, probajte da li odradi ili baci exception? (meni posle random broja komandi odbije poslusnost sa -7 card missing)


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
Prikačeni fajlovi
 
Odgovor na temu

[es] :: .NET :: Korišćenje dll-a i .h datoteka pisanih u C-u

Strane: 1 2

[ Pregleda: 7430 | Odgovora: 36 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.