[ SaleB81 @ 23.09.2012. 00:34 ] @
Odmah bih napomenuo da nisam programer, pisao sam neke stvari u vb.net i vba (excel) i sve je besprekorno radilo, ali ja ipak nisam programer, a C tek ne poznajem. Igrom slucaja API za saobracajne dozvole je napisan u C-u. Uputstvo za rukovanje apijem sam procitao nekoliko puta i dalje mi nista nije jasno.

Zelja mi je da u jednom excel fajlu omogucim popunjavanje forme podacima sa saobracjne, koji se trenutno rucno prepisuju iz prozora mupove aplikacije u formu u excelu (koja kasnije kreira unos u odgovarajucoj tabeli).

Do sad mi je postalo jasno kako se otprilike deklarise dll u vba, procitao sam temu http://www.elitesecurity.org/t...-0-Citac-licnih-karti-celikapi gde je kiklop74 za celik napisao prevod na vb za header fajl. Trenutno toliko malo znam o problemu predamnom, da ne znam ni sta mi nije jasno i sta treba da pitam.

Ako neko ima vremena i volje da pomogne ili zanimljiv link ciji sadrzaj bih mogao da procitam, bicu vrlo zahvalan.

Pozdrav
[ SaleB81 @ 23.09.2012. 02:15 ] @
U medjuvremenu sam napravio neki pomak, ono sto je kiklop74 napravio za celikapi, ja sam pravio za eVehicleRegistration, ali nisam sasvim siguran sta s njim da radim, a predpostavljam da sam nege i neku greskicu napravio. Postoji nekoliko promenljivih uputstvu za saobracajne koje su tipa long* i char*, nisam bio siguran cemu sluzi zvezdica, pa sam im dodelio tipove Long i String.

Komplet fajl sa svim komentarima cu da prilozim, pa koji voljan da prokomentarise bicu mu zahvalan. Takodje me zanima kako da primenim to sto sam napravio, pod predpostavkom da ce u nekom trenutku biti ispravljene greske nastale u njemu.

Code:
Option Explicit

'Declare PtrSafe Function PozivCitaca Lib "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" _
' (ownersPersonalNo As Characters, ownersPersonalNoSize As Long, ownersSurnameOrBusinessName As Characters, _
' ownersSurnameOrBusinessNameSize As Long, ownerName As Characters, ownerNameSize As Long, ownerAddress As Characters, _
' ownerAddressSize As Long, usersPersonalNo As Characters, usersPersonalNoSize As Long, usersSurnameOrBusinessName As Characters, _
' usersSurnameOrBusinessNameSize As Long, usersName As Characters, usersNameSize As Long, usersAddress As Characters, _
' usersAddressSize As Long) As SD_PERSONAL_DATA()

'Public Declare Function PozivCitaca Lib "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" Alias "eVehicle" ()


'    Registration.Initialize
'    Registration.ProcessNewCard
'    Registration.ReadPersonalData
    

Const C5 = 5
Const C16 = 16
Const C20 = 20
Const C30 = 30
Const C50 = 50
Const C100 = 100
Const C200 = 200
Const C1024 = 1024
Const C4096 = 4096

' //
'// Function return values
'//

'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


Public Type groupSD_DOCUMENT_DATA
    stateIssuing As String * C50
    stateIssuingSize As Long
    competentAuthority As String * C50
    competentAuthoritySize As Long
    authorityIssuing As String * C50
    authorityIssuingSize As Long
    unambiguousNumber As String * C30
    unambiguousNumberSize As Long
    issuingDate As String * C16
    issuingDateSize As Long
    expiryDate As String * C16
    expiryDateSize As Long
    serialNumber As String * C20
    serialNumberSize As Long
End Type

Public Type groupSD_VEHICLE_DATA
    dateOfFirstRegistration As String * C16
    dateOfFirstRegistration As Long
    yearOfProduction As String * C5
    yearOfProductionSize As Long
    vehicleMake As String * C100
    vehicleMakeSize As Long
    vehicleType As String * C100
    vehicleTypeSize As Long
    commercialDescription As String * C100
    commercialDescriptionSize As Long
    vehicleIDNumber As String * C100
    vehicleIDNumberSize As Long
    registrationNumberOfVehicle As String * C20
    registrationNumberOfVehicleSize As Long
    maximumNetPower As String * C20
    maximumNetPowerSize As Long
    engineCapacity As String * C20
    engineCapacitySize As Long
    typeOfFuel As String * C100
    typeOfFuelSize As Long
    powerWeightRatio As String * C20
    powerWeightRatioSize As Long
    vehicleMass As String * C020
    vehicleMassSize As Long
    maximumPermissibleLadenMass As String * C20
    maximumPermissibleLadenMassSize As Long
    typeApprovalNumber As String * C50
    typeApprovalNumberSize As Long
    numberOfSeats As String * C20
    numberOfSeatsSize As Long
    numberOfStandingPlaces As String * C20
    numberOfStandingPlacesSize As Long
    engineIDNumber As String * C100
    engineIDNumberSize As Long
    numberOfAxles As String * C20
    numberOfAxlesSize As Long
    vehicleCategory As String * C50
    vehicleCategorySize As Long
    colourOfVehicle As String * C50
    colourOfVehicleSize As Long
    restrictionToChangeOwner As String * C200
    restrictionToChangeOwnerSize As Long
    vehicleLoad As String * C20
    vehicleLoadSize As Long
End Type

Public Type tagSD_PERSONAL_DATA
    ownersPersonalNo As String * C20
    ownersPersonalNoSize As Long
    ownersSurnameOrBusinessName As String * C100
    ownersSurnameOrBusinessNameSize As Long
    ownerName As String * C100
    ownerNameSize As Long
    ownerAddress As String * C200
    ownerAddressSize As Long
    usersPersonalNo As String * C20
    usersPersonalNoSize As Long
    usersSurnameOrBusinessName As String * C100
    usersSurnameOrBusinessNameSize As Long
    usersName As String * C100
    usersNameSize As Long
    usersAddress As String * C200
    usersAddressSize As Long
End Type

Public Type groupSD_REGISTRATION_DATA
    registrationData As String * C4096
    registrationDataSize As Long
    signatureData As String * C1024
    signatureDataSize As Long
    issuingAuthority As String * C4096
    issuingAuthoritySize As Long
End Type

Public Declare Function sdStartup Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" _
 (version As Long) As Long

Public Declare Function sdCleanup Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" () As Long

'GetReaderName treba proveriti
Public Declare Function GetReaderName Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" _
 (index As Long, readerName As String, nameSize As Long) As Long

'SelectReader treba proveriti
Public Declare Function SelectReader Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" (reader As String) As Long

Public Declare Function sdProcessNewCard Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" () As Long

Public Declare Function sdReadDocumentData Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" _
 (SD_DOCUMENT_DATA As groupSD_DOCUMENT_DATA) As Long

Public Declare Function sdReadVehicleData Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" _
 (SD_VEHICLE_DATA As groupSD_VEHICLE_DATA) As Long

Public Declare Function sdReadPersonalData Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" _
 (SD_PERSONAL_DATA As tagSD_PERSONAL_DATA) As Long

Public Declare Function sdReadRegistrationData Lib _
 "C:\...\SaobracajnaApi\eVehicleRegistrationCOM.dll" _
 (SD_REGISTRATION_DATA As groupSD_REGISTRATION_DATA, index As Long) As Long
[ ljube @ 24.09.2012. 16:51 ] @
Meni ovo izgleda da ima i COM/ActiveX interfejs a onda možeš lakše da ga koristiš u VBA.

Pokušaj da u VBA u meniju Tools - References nađeš ovaj objekat. Ako ima activex interfejs onda bi trebalo da postoji tu.

Dalje bi išla deklaracija Public "WithEvents eReg As Ime.COMObjekta" (ime potraži u Object browseru ako uspiješ napraviti referencu).


Pozdrav,
Ljubiša



[Ovu poruku je menjao ljube dana 25.09.2012. u 16:52 GMT+1]
[ RobiS @ 09.10.2012. 01:55 ] @
Što se tiče programa za čitanje saobraćajnih dozvola, kod mene ovako stoje stvari:

S'obzirom da se u c/c++ ne snalazim baš najbolje, rešio sam da iskoristim dobri-stari Visual Basic.
I tu je sve krenulo naopako...
Sa ČELIK-om sam se ranije nekako izborio, ali je ovo sasvim druga priča. Jasno mi je da je eVehicleRegistrationAPI napisan za c/c++, a da je eVehicleRegistrationCOM namenjen za c# i VB. Na početku je sve izgledalo OK:
1. kopiranje dll-a u system32 folder
2. registrovanje dll-a preko regsvr32
3. povezivanje dll-a sa VB-om preko Project/References
4. sve ostale stvari i sitnice...
E, sad: inicijalizacija, čitanje nove kartice i određivanje imena kartice nekako prođu. Kada se dođe do čitanja ostalih podataka sa kartice, javlja se greška (nešto u smislu: tipovi podataka se ne poklapaju).

Problem:

Sama biblioteka je izgleda pisana u C-u.
Svi podaci su stringovi koji se nalaze u UDT grupama (C++ strukture, VB tipovi). Problem je u tome što VB nemože da pročita C 'strukturu' koja sadrži stringove i prebaci je u VB 'tip' koji opet sadrži stringove. Zato je ime kartice prošlo bez problema, jer pozvana funkcija vraća string (name) i broj (index), a svi ostali podaci se nalaze u strukturama. Posle mnogo neuspelih pokušaja umalo nisam digao ruke. Pokušavao sam da smislim i pronađem razne konverzije tipova podataka ali uzalud....

Delimično rešenje:

Nisam napomenuo da je sve ovo vezano za Visual Basic 6.
Sa net-a sam skinuo VB 2012, odradio manje-više sve kao i ranije i... sve radi perfektno!!! (ovo manje-više se odnosi na razlike u sintaksi između VB6 i VB 2012).

Interesuje me zašto dll može da se iskoristi u VB 2012 a nemože u VB6?
Trebao bih da napišem program koji, pored ostalog, sadrži i čitanje saobraćajnih dozvola a ne bih da kompletan kod pišem u VB 2012 jer VB6 poznajem dovoljno dobro. Ako neko zna kako ovo može da se reši, bio bih veoma zahvalan.
Takođe, da li je nekom pošlo za rukom da iskoristi dll preko Jave ili PHP-a?

Pozdrav,
RobiS
[ Goran Rakić @ 09.10.2012. 02:18 ] @
Kako misliš da koristiš preko PHP-a? Da li želiš da očitavaš karticu u čitaču koji je na serveru ili na računaru klijenta? Ili pišeš neki PHP skript koji se izvršava lokalno?
[ RobiS @ 10.10.2012. 14:31 ] @
Dll bi u svakom slučaju bio na serveru, registrovan i u system32 folderu. Malo sam lutao internetom i našo neke stvari u vezi pozivanja dll-a preko PHP-a i mislim da je izvodljivo pozvati eVehicleRegistrationCOM. U svakom slučaju, cela stvar sa PHP-om, Javom i dll-ovima je samo razmišljanje.

Više me interesuje druga stvar: zbog čega ovaj dll neće da radi u VB6 a u VB 2012 hoće? Dobija se poruka 'ByRef argument type mismatch' ili samo 'type mismatch' Proverio sam tipove podataka i tu je sve ok: dll vraća strukturu od stringova koja ide u tip sa stringovima. Sve se poklapa ali jednostavno NEĆE da radi... Jedino što mi pada na pamet je da VB6 jednostavno ne može da prihvati strukturu iz dll-a pisanom u C jeziku (nešto vezano sa pokazivačima i veličinom stack-ova... valjda).

Da li je neko rešio ovaj problem?

Pošto sam ovde zaglavio, danas ću probati da pročitam saobraćajnu iz PHP-a. Javljam rezultate, ukoliko nekome zatreba :)
[ Goran Rakić @ 10.10.2012. 17:21 ] @
Za VB ne znam, ali što se PHP-a tiče jasno ti je verovatno da taj DLL kada se učita može da pročita samo karticu iz čitača koji je na serveru?
[ RobiS @ 11.10.2012. 18:36 ] @
Ideja i jeste da sve radi na lokalu, stvarno ne znam da li bi kartica mogla da se očita 'daljinski'.
U svakom slučaju dobija se sledeća poruka:
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `eVehicleRegistrationCOM.Registration': No such interface supported ' in... što bi od prilike trebalo da znači da ovaj dll ne može da se koristi preko PHP-a :(
DLL je registrovan i u system32 folderu.
Registration je funkcija koja obavlja sve stvari ( npr: Registration.Initialize() ).

Evo primera:

<?php
$my_dll = new COM("eVehicleRegistrationCOM.Registration");
$my_dll->Initialize();
$my_dll->GetReaderName($index, $name);
$my_dll->SelectReader($name);
$my_dll->ProcessNewCard();
$my_dll->ReadDocumentData($d_data);
$my_dll->Finalize();
?>

'$d_data' bi terbao da bude 'User Defined Type' od 7 stringova ali ne znam kako to ide u PHP-u. Ili neki array od 7 stringova... kako god kod zakuca na prvoj liniji.
Šteta... možda bi mogao da se napravi program u, recimo VB 2012, da taj program napravi txt fajl, pa da se iz PHP-a pozove txt fajl i očita sav potreban info. Ovo mi ipak izgleda kao posao preko posla.