Registracija FiskalizacijaDEV.COM.dll assemblia

Nov 24, 2012 at 6:57 PM

Da li je bitno ako se npr. registracija assemblia sa regasm ...dll /codebase radi iz "Direktorij1", a COM.dll se kasnije koristi iz "Direktorij2", obzirom da se u registry zapiše i putanja?

Coordinator
Nov 25, 2012 at 8:10 AM

Mislim da ti to neće ići - tamo gdje napraviš regasm, od tamo i moraš koristiti DLL-ove, ne možeš ih kasnije premjestiti negdje drugdje.

Nov 26, 2012 at 12:07 PM

Zapažanja do kojih sam došao ...

Preduvjeti:

- računala Server, Stanica1, Stanica2 u lokalnoj mreži, OS-ovi windowsi (7, xp ...)
- na sva tri računala instaliran fina root demo certifikat, aplikacijski certifikat Fiskal 1 se koristi preko pfx datoteke i pasworda koja se nalazi samo na serveru
- program u Delphi XE2 se nalazi samo na Serveru zajedno sa bazom, na stanicama je samo izvučen shortcut na glavni program koji se nalazi na serveru, program se pokreće na sva tri računala

Funkcijama cisa se pristupa tako da se kreira cis objekt i onda pozivaju funkcije npr.
cis := CreateOleObject('Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav');
cis.PosaljiEcho('Test poruka');

U Delphi programu koristim u postavkama tipku za provjeru ispravne instalacije DEV.COM komponente tako da pokušam kreirati CIS objekt, ako to ne uspije hvatam grešku i javljam korisniku da mora registrirati tu komponentu. Ovo mi se čini kao brža i jednostavnija varijanta nego traženje CLSID-a u registriu iako se tada može i isčitati i verzija cisa.

(Prvo sam mislio da Raverus.FiskalizacijaDEV.dll i Raverus.FiskalizacijaDEV.COM.dll moraju obavezno biti u direktoriju gdje se nalazi glavni delphi program, ali nije tako.)

U Delphi programu se u postavkama nalaze tipke vezane uz FiskalizacijaDEV.COM registraciju:
- Registriraj
- Deregistriraj
- Provjeri status registracije

Odabirom tipke Registriraj Delphi program će na računalo kopirati direktorij FiskalizacijaDEV, npr. u root c diska, i u njemu datoteke (koje se mogu nalaziti bilo gdje prije toga pa ako treba i u resursima samog delphi programa ili u bazi):
- Raverus.FiskalizacijaDEV.dll
- Raverus.FiskalizacijaDEV.COM.dll
- regasm.exe
- register.bat
- unregister.bat

Sadržaj register.bat je:

c:
cd \FiskalizacijaDEV
regasm raverus.fiskalizacijaDev.Com.dll /codebase

Tj unregister.bat:
c:
cd \FiskalizacijaDEV
regasm raverus.fiskalizacijaDev.Com.dll /unregister

Nakon uspješnog kopiranja datotoeka pokreće se register.bat preko ShellExecuteEx funkcije te se tako izvršava registracija DEV.COM komponente na računalu SA KOJEG je pokrenut delphi program (to ne mora biti računalo gdje se nalazi delphi program).

Dakle korisnik na svakom računalu sa kojeg se želi pokrenuti program i raditi izdavanje računa (tj. vršiti komunikacija sa CIS-om, potpisivati i dr.) mora samo pokrenuti u programu tipku Registriraj.
Ako procedura ne uspije (a što se lako utvrdi provjerom krerianja cis objekta) tada mu otvaram navedeni direktorij u Windows Exploreru sa uputom da mora kliknuti desnim klikom miša na tipku Register.bat i odabrati opciju "Run as administrator". (u tu svrhu mu u .bat datoteke dodajem i red pause da može vidjeti rezultat, a što ne smije biti u automatskoj metodi jer onda ShellExecute ostane visiti).

!! Registracija DEV.COM dll-ova sa RegAsm je moguća samo ako se dll-ovi nalaze na lokalnom računalu !!
Dakle ne mogu se nalaziti na nekom mrežnom disku, mapiranom disku i sl. iz tog razloga je obavezno kopiranje tih datotkea sa servera na stanicu.

Zanimljivo je da na računalu server gdje je program DEV.COM dll-ovi ne moraju biti prisutni niti registrirani ako se na tom računalu ne koristi izdavanje računa.

Kada se delphi program koji se nalazi na serveru pokreće sa stanice, program se učitava u memoriju stanice, delphi program pokušava kreirati CIS objekt i u toj operaciji operativni sistem stanice provjerava da li je 'Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav' registrirana na toj stanici, zatim u Registriu iz ValueName: CodeBase pronalazi putanju do dll-ova Data:file:///c:/FiskalizacijaDEV/Raverus.FiskalizacijaDEV.COM.DLL koji dakle moraju na toj stanici biti u direktoriju iz kojeg je pokrenut register.bat tj. RegAsm .....dll /codebase.

Za cijelu priču je potpuno nebitno što se nalazi i što je registrirano na serveru gdje se zapravo nalazi delphi program, bitno je jedino da na računalu sa kojeg je pokrenut program postoji registraciju u Registriu tog računala i da u putanji koja je navedena u registriu postoje dll-ovi.

Potrebno je dodatno obratiti pažnju na to da istodobno mogu biti registrirane i verzija 1.1 i ver 1.2 ...DEV.COM i da se deregistracija ver 1.1 ne može napraviti sa ver 1.2.
(možda dodati neku funkciju koja vraća verziju DEV.COMa)

Na kraju da se osvrnem na moj prvi post u ovoj diskusiji u kojem postavljam pitanje direktorija instalacije i direktorija korištenja, direktorij korištenja ne postoji jer delphi aplikacija ne traži direktorij nego registraciju komponente u registriu i onda sistem upućuje na direktorij gdje se nalaze dll-ovi.

Recimo na stanici uredno kopirate dll-ove i registrirate ih, uđete u program i sve uredno radi, čim se preimenuje direktorij sa DEV.COM dll-ovima komponenta ne radi (tj. radit će dok se ne izađe iz programa i uđe ponovo jer se kreiranje cis objekta drugi puta poziva iz casha).

Ovo nije moja domena pa molim kompetentnije osobe da daju svoj komentar.

Coordinator
Nov 26, 2012 at 12:17 PM

Hvala na iscrpnom izvještaju, vjerujem da će mnogima poslužiti. Ako se slažeš stavit ćemo link na stranicu sa dokumentacijom :)

 

Da li korisnik mora biti lokalni administrator da bi regasm radio? Ne mislim na UAC na Win7, nego, recimo, na Win XP?

Što se tiče direktorija, tako je kako si napisao - dakle - regasm će registrirati COM objekt unutar Windows-a, koji se nalazi u točno određenom DLL-u u točno određenom folderu. Ako pobrišeš DLL i/ili folder ili nešto preimenuješ, sve će prestati raditi - brisanje DLL-a ne znači i deregistraciju COM objekta.

 

Nov 26, 2012 at 7:24 PM
Edited Nov 27, 2012 at 9:19 AM

Kako RegAsm.exe mijenja registry na računalu obavezno je da je korisnik logiran kao user koji ima prava izmjene registria tj. Administrator ili ako ima nešto tipa PowerUser i sl. koji bi to isto mogao.

Korisnik ne mora biti logiran kao Administrator, može pokrenuti register.bat klikom na desnu tipku miša pa Run as Administrator i upisati lozinku.

Na Win XP toga nema pa je potrebno u Start meniu pronaći Cmd i onda to napraviti na njemu.

---------------------------------------------

Daljnim istraživanjem moram se malo dopuniti, dakle nakon što se na određenom računalu izvrši registracija sa RegAsm.exe Raverus.FiskalizacijaDev.Com.dll /codebase i to npr. iz direktorija c:\FiskalizacijaDEV, ako taj direktorij ne bude brisan\mijenjan sve aplikacije koje se pokrenu na tom računalu mogu koristiti tu COM komponentu.

 Ako se taj direktorij preimenuje/obriše, tj. putanja koja je zapisana u registriu više ne postoji na lokalnom računalu, i dalje će se moći koristiti DEV.COM komponenta u programu, ALI SAMO kod aplikacija koje će dll-ove imati u istom direktoriju gdje i program koji se pokreće.

 Iz ovoga se izvodi zaključak, kada se pokrene delphi aplikacija i pokuša kreirati COM objekt lokalni sistem na računalu će pokušati pronaći COM dll-ove ili u putanji navedenoj u registriu (koja može jedino biti putanja unutar lokalnog računala) ili će ih potražiti unutar direktorija gdje je pokrenut .exe program, zgodno je da u ovom drugom slučaju dll-ovi dakle mogu biti i na nekoj lokaciji na mreži kao i izvršni program (ne na lokalnom računalu) za razliku od postupka registracije sa RegAsm.exe gdje moraju biti baš na lokalnom računalu. Ovo sam izričito probao.

 Dakle ako na stanici želim izvršiti registraciju DEV.COM, mogu dll-ove iz direktorija sa servera kopirati u neki Temp direktorij na stanici, izvršiti registraciju na tom računalu i zatim ih bez bojazni obrisati jer će se ionako koristiti dll-ovi sa servera iz direktorija gdje je i izvršni program. Uvijek mi je draže da na lokalnim stanicama (kojih može biti na desetke) ima što manje nečega za administriranje kod nadogradnji i sl.

 Ovdje ostaje jedan veliki upitnik vezano za verziju dll-a, naime kod više različitih verzija osnovni key u registriu se kreira samo jednom, a ispod njega u InprocServer32 se kreiraju verzije 1.1.0.0 i 1.2.0.0.

Postavlja se pitanje ako su registrirane obje DEV.COM verzije koja se pokreće?, pri tome mislim da je bolje da se javlja greška nego da se pokreće kriva verzija.

 U tom smislu je dodatno pametnije ići na varijantu da se dll-ovi nalaze samo jednom mjestu na serveru zajedno sa izvršnim exe-om jer se DEV.COM npr. ver 1.1 neće pokrenuti na dll-ovima ver 1.2. Kod nadogradnje sustava dovoljeno je samo na serveru zamijeniti stare dll-ove sa novijom verzijom i stanice koje nisu napravile doregistraciju na noviju verziju će javljati grešku u izvršavanju jer bi logička greška u izračunima bila teža za otkriti.

 Napravio sam sljedeće testove:

- u direktoriju na Serveru: izvršni program + DEV.COM dll-ovi
- na stanici nema programa nego je otvoren Windows Explorer sa share-anim direktorijem servera.
- na stanici su na C disku kreirani FiskalizacijaDev v1.1 i FiskalizacijaDev v1.2, sa dll-ovima
- na stanici je pokrenuta registracija regasm ... za verziju 1.1 i nakon toga preimenovan FiskalizacijaDev v1.1 npr. sa dodatkom X da registri ne vidi dll-ove
- zatim je to isto napravljeno sa ver 1.2
- nakon toga u registriu imamo registracije za obje verzije
- zatim su na serveru u direktorij sa izvšnim programom kopirani dll-ovi verzije 1.1
- pokrenut je izvršni program i pokušao sam kreirati DEV.COM objekt - neuspjelo
- zatim sam umjesto verzije 1.1 na server kopirao dll-ove verzije 1.2, pokrenuo izvršni program i kreiranje cis objekta - uspjelo
- zatim sam obrisao registraciju u registriu za ver 1.2 i kopirao dll-ove ver 1.1 na server, krerianje cis objekta je - uspjelo

E sad da li sistem kod registracije više verzije nekog com objekta traži da se pokreću dll-ovi više verzije, ili je priča vezana uz redoslijed registracija dll-ova ili nešto treće mi je manje bitno i nije mi se dalo raditi sve moguće kombinacije.

Zaključak koji mi je bitan je da ako kod nadogradnje sustava na server kopiram nove dll-ove npr. buduću ver 1.3, svaka stanica koja se pokrene (na kojoj je bila registrirana stara verzija 1.1, 1.2 ili nijedna) će javiti grešku kod kreiranja cis objekta i korisnik će morati napraviti registraciju na toj stanici, naravno sa dll-ovima verzije 1.3., i to bez potrebe da radi dodatno DEregistraciju starih verzija.

Na taj način "neuki" korisnik, ako nešto nije registrirano na stanici, ili nije registrirana zadnja verzija DEV.COM objekta ili sl., će samo pokrenuti unutar delphi programa tipku Registriraj.

Dodatno, kad su dll-ovi u direktoriju na serveru nije nikakav problem provjeriti verziju od Raverus.FiskalizacijaDEV.COM.dll npr. funkcijom ...

function GetBuildInfoDatoteke(datoteka: string): variant;

var verInfoSize: DWord;

   verInfo: Pointer;

   VerValueSize: DWord;

   VerValue: PVSFixedFileInfo;

   Dummy: DWord;

   version: variant;

begin

version:= VarArrayCreate([1, 4], varInteger);

verInfoSize:= getFileVersionInfoSize(PChar(datoteka), Dummy);

GetMem(verInfo, verInfoSize);

GetFileVersionInfo(PChar(datoteka), 0, verInfoSize, verInfo);

verQueryValue(verInfo, '\', pointer(verValue), verValueSize);

with verValue^ do begin

   version[1]:= dwFileVersionMS shr 16;

   version[2]:= dwFileVersionMS and $FFFF;

   version[3]:= dwFileVersionLS shr 16;

   version[4]:= dwFileVersionLS and $FFFF;

end;

freeMem(verInfo, verInfoSize);

result:= version;

end;

Naravno moguće je da npr. nije instaliran certifikat, da nema veze na internet, da cis ne radi i sl., ali za to imamo dodatne tipke za provjeru koje korisnik može ručno pokrenuti, a te procedure se mogu i automatski pokretati u određenim situacijama (npr. kod pokretanja programa ili otvaranja prozora za fakturiranje).

Provjere:

1- provjera COM registracije
2- provjera internet veze
3- provjera rada CIS u PU
4- provjera potpisivanja certifikatom

1. Provjera com registracije:
je pokušaj kreiranja com objekta cis := CreateOleObject('Raverus.FiskalizacijaDEV.COM.CentralniInformacijskiSustav'); hvata se greška kreiranje i korisnika upućuje na registraciju DEV.COM na toj stanici (ili mu se ista odmah nudi).

2 Provjera interneta:
function IsInternetConnected: boolean;

const

// local system uses a modem to connect to the Internet.

INTERNET_CONNECTION_MODEM     = 1;

// local system uses a local area network to connect to the Internet.

INTERNET_CONNECTION_LAN       = 2;

// local system uses a proxy server to connect to the Internet.

INTERNET_CONNECTION_PROXY     = 4;

// local system's modem is busy with a non-Internet connection.

INTERNET_CONNECTION_MODEM_BUSY = 8;

 

var

dwConnectionTypes : DWORD;

begin

result:= false;

dwConnectionTypes := INTERNET_CONNECTION_MODEM +

                       INTERNET_CONNECTION_LAN +

                       INTERNET_CONNECTION_PROXY;

Result := InternetGetConnectedState(@dwConnectionTypes,0);

end;

3 Provjera dostupnosti rada CIS-a:
Dovoljono je samo poslati echo poruku cis.PosaljiEcho('Test poruka'); ili koristiti funkciju cis.DohvatiStatusCisServisa

4. Provjera potpisivanja certifikatom
Za ovu provjeru prvo radim sve gornje provjere (registracija, internet, cis).
Kreiramo jednostavn xml zahtjev npr.

zahtjev:= '<PoslovniProstorZahtjev Id="signXmlId">'+'</PoslovniProstorZahtjev>';

koristimo funkciju cis. PotpisiXMLDokumentCertifikatDatoteka (zahtjev, putCertifikat, lozinka);
Naravno ništa se ne šalje u cis, ovo je samo provjera.
Ovo je dodatni razlog zašto je meni trebala odvojeno funkcija za potpisivanje iako postoji funkcija koja u jednom radi 3 stvari (potpisuje, soap envelope i slanje), xml zahtjev odvojeno potpisujem i hvatam grešku u except te korisniku javljam njemu razumljivu poruku da ima problema sa certifikatima.

(što se samih poruka grešaka tiče, bilo bi zgodno oformiti bazu svih poruka koje su se pojavljivale i povezati ih sa jednim ili više scenarija u kojima se pojavljuju)

Ako sve provjere rade eventualne probleme treba tražiti u logičkim pogreškama programa tj. neispravnosti xml prema FiskalizacijaSchema.xsd.

Moguće je u delphiu pokrenuti automatsku provjeru podataka prema shemi, ali uz korištenje vanjskih (free) dll-ova microsofta za xml rutine, međutim možemo koristiti i neku poluručnu međuvarijantu koja je implementirana u delphiu a to je TRegEx funkcija koja provjerava da li podatak odgovara paternu, ukratko npr. za provjeru naziva poslovne jedinice koristimo kod

if not TRegEx.IsMatch('Jedinica2', '[0-9a-zA-Z]{1,20}') then poruka greške; patern prepišemo iz sheme FiskalizacijaSchema.xsd

Opet se vraćam na temu registracije .net assemblia, kad čovjek njuška po internetu svaka ideja dobije više rješenja, dakle postoji čak varijanta da se DEV.COM komponenta koristi u delphiu bez potrebe za registracijom na svakom računalu ili prevedeno da se .net objekti koriste direktno u delphiu, naravno sve ima svoj za i protiv.

1. izvor http://www.atozed.com/CrossTalk/index.en.aspx

"CrossTalk allows native Delphi code to consume and use .NET classes and libraries. No changes or control is required to the .NET classes. CrossTalk makes the classes available so that they look like native classes. No registry entries or COM registration is required. Only a few DLL files in your application directory are required."

2. izvor https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

3. izvor http://stackoverflow.com/questions/5074563/registration-free-com-dll/5078671#5078671

Dodatna stvar koju treba paziti kod RegAsm.exe je njegova verzija, ako korisniku distribuirate verziju 4 tada će on morati imati instaliran .NET framework 4 na računalu, a neka starija XP računala to nemaju. Zato je možda pametnije distribuirati regasm ver 2 gdje se traži .NET 2.

Nov 27, 2012 at 5:42 PM
Edited Nov 27, 2012 at 5:45 PM

Može malo objašnjene u vezi dll-ova.

Prvo, među datotekama za download u COM direktoriju je i Raverus.FiskalizacijaDEV.XmlSerializers.dll, ja ga uopće nisam ubacio sa ostalim dll-ovima prilikom testiranja i pri tome nije bilo nikakvih grešaka.

Da li to znači da taj dll nije potreban ili nisam baš koristio funkciju iz Raverus.FiskalizacijaDEV.COM.dll kojoj je potreban taj dll?

Drugo, u download direktoriju postoje NET20, NET30, NET35, NET40 direktoriji, unutar svakog od njih su dalje:
- AnyCPU (Raverus.FiskalizacijaDEV.dll, Raverus.FiskalizacijaDEV.dll.config, Raverus.FiskalizacijaDEV.XmlSerializers.dll)
- x64 (Raverus.FiskalizacijaDEV.dll, Raverus.FiskalizacijaDEV.dll.config)
- x86 (Raverus.FiskalizacijaDEV.dll, Raverus.FiskalizacijaDEV.dll.config, Raverus.FiskalizacijaDEV.XmlSerializers.dll)

Kakva je tu sada priča sa dll-ovima iz ovih NETx direktorija.

 Ako svi dll-ovi bez obzira iz kojeg su NETx direktorija imaju istu funkcionalnost zar nije logično uzeti onaj za .NET20 za kojeg je pretpostaviti da se nalazi na gotovo svakom računalu?

Isto pitanje za CPU, zar nije logično uzeti one iz AnyCPU pa izbjeći iznenađenja.

Čemu služi Raverus.FiskalizacijaDEV.XmlSerializers.dll, i zašto ga nema u x64?
(vidim da se nalazi u FiskalizacijaSchema.designer.cs u kodu)

Dodatna priča je RegAsm.exe koji isto postoji u verzijama 2.0 ... 4.0.

Što se RegAsm.exe tiče već sam uočio da ako na konkretnom računalu nije instaliran .NET 4.0 nego .NET 2.0 ne radi RegAsm.exe koji ima verziju 4.0, u tom slučaju radi RegAsm.exe v 2.0 pa je logično koristiti samo ver 2.0.

Coordinator
Nov 27, 2012 at 5:50 PM

@deva55Raverus.FiskalizacijaDEV.XmlSerializers.dll - pogledaj ovo za pojašnjenje: http://stackoverflow.com/questions/934411/what-is-myassembly-xmlserializers-dll-generated-for

DLL-ovi buildani sa druge verzije .NET-a imaju jedino smisla onima koji rade u .NET - u; svi ostali trebaju ići sa onime što i je označeno kao "Recommended download" - .NET 2.0 Any CPU.

Nov 27, 2012 at 5:59 PM

OK, iz pojašnjenja sa linka se čini da nije potrebno distribuirati taj dll, tj. ako bude potreban generirat će se sam.

Obzirom na malu zbrku i da ne kompliciram, da li je za ...DEV.COM varijantu dovoljno distribuirati samo dva dll-a iz COM direktorija: Raverus.FiskalizacijaDEV.COM.dll, Raverus.FiskalizacijaDEV.dll ?

Coordinator
Nov 27, 2012 at 6:00 PM

Da, dovoljna su samo ta dva DLL-a, bez Raverus.FiskalizacijaDEV.XmlSerializers.dll