• 14 odgovora
  • 5.136 pregleda
Dva .dll-a sa istim nazivom ali nisu isti 09.12.2015. u 13:52 · pre 132 meseci #1
Opet ja sa čudnim problemima :D

Dakle, imam dva .dll-a koji moraju biti u istom folderu gdje je i .exe aplikacije. Imaju isti naziv (libeay32.dll) ali su različite verzije. Treba mi i jedna i druga verzija. Koliko sam pronašao na google-u, nije pametno, a i možda ne bi radilo na svim PC-evima da idem mijenjati PATH .dll-ova.

Da li netko ima iskustva, savjeta?

Hvala
Potpis
F
Re: Dva .dll-a sa istim nazivom ali nisu isti 09.12.2015. u 20:58 · pre 132 meseci #2
:)

Prvo, da li TEBI treba i jedna i druga verzija, ili interno nekoj biblioteci koju koristis? Drugo, kako to mislis "menjati PATH .dll-va"?

Ovo prvo pitam u smislu da li ti licno ucitavas DLL-ove u aplikaciju, imajuci pritom potpunu kontrolu nad nacinom kako to radis (i mogucnost da proveris kad si koji DLL ucitao), ili neka biblioteka (Indy?) to radi sama za sebe, na uobicajeni ili neki specifican nacin.

Ako sam ucitavas i koristis DLL-ove, onda nema problema, mozes ih staviti gde god hoces, i ucitavati odatle. Ipak, pretpostavljam da nemas kontrolu nad nacinom ucitavanja, cim postavljas ovakvo pitanje...? Ako je tako, zanima me kako mislis da program (odnosno ta biblioteka) zna kada je koji DLL ucitala (pa da eventualno ucita drugi, ako joj on treba)? Da li imas nacin da ti to kontrolises (menjajuci izvorni kod te biblioteke, ili vec nekako)?

Ovo drugo me interesuje jer ne znam na sta tacno mislis. Ako se DLL-ovi ucitavaju na uobicajeni nacin (samo ime dll-a, gde se nalazenje putanje ostavlja sistemu), onda gde god da stavis dll-ove uvek ce biti ucitan onaj koji se prvi nadje na putanji pretrage.

Ako nemas mogucnosti da kontrolises kad se i kako koji DLL ucitava, prvo sto mi pada na pamet je pravljenje treceg, proxy DLL-a koji ce nositi isti taj naziv i biti kraj EXE fajla, a druga dva ces imenovati kako hoces i staviti gde hoces - proxy DLL treba da exportuje sve metode koji ce EXE koristiti iz druga dva DLL-a, i da po potrebi ucitava jedan i/ili drugi, i sam poziv koji je njemu upucen prosledjuje odgovarajucem DLL-u.

Druga varijanta je da nekako unutar same aplikacije (EXE) presreces pozive metodama DLL-a (neki hook?), pa da po potrebi ucitavas i podmeces odgovarajuci DLL.

E sad, mozda ne bi bilo lose da nam malo detaljnije opises situaciju/problem koji te je doveo do toga da zelis da koristis dva ista (a razlicita) DLL-a iz istog foldera, mozda postoji prostije resenje...? :)
Re: Dva .dll-a sa istim nazivom ali nisu isti 10.12.2015. u 10:11 · pre 132 meseci #5
Stavis jednu verziju u glavni folder (path1) gde je .exe a drugi u odvojeni folder recimo "old version" (path2) i
ucitavas dll-ove dinamicki sa LoadLibrary(path1) a drugi LoadLibrary (path2)

Mada i dalje mi nije jasno zasto koristis 2 verzije openssl-a v(libeay.dll) u kodu? :)
Potpis
Viva lollapalooza
Re: Dva .dll-a sa istim nazivom ali nisu isti 10.12.2015. u 10:23 · pre 132 meseci #6
U istom folderu je nemoguće, jedino jedan ostaviti u rutu programa a drugi snimi u "...\Windows\System32", mada mislim da ni to nije rešenje ako ih ne učitavaš ručno.
Potpis
Nikad izvini!
Re: Dva .dll-a sa istim nazivom ali nisu isti 10.12.2015. u 11:26 · pre 132 meseci #7
Dakle, za fiskalizaciju koristim openssl i njegov libeay32.dll.
Indy ima svoj libeay32.dll (pronašao sam na google-u da taj Indy-ev libeay nema nikakve veze sa openssl-om, a zašto su ga tako nazvali je dobro pitanje :/ ).

Kako mi za fiskalizaciju treba taj od openssl-a, a za nešto drugo mi treba ovaj od Indy-a, moraju bi oba dva biti u istom folderu. Pronašao sam način za preimenovati jedan libeay32.dll, njegovo ime je definirano u sourceu libeay32.pas

Code:
  LIBEAY_DLL_NAME = 'libeay32.dll';


Samo šta imam još par dll-ova, npr. ssleay32.dll, a za njega ne mogu nigdje pronaći gdje ga preimenovati ili mu odrediti putanju odakle če se učitavati. Ja te .dll-ove nigdje ne pozivam sa LoadLibrary.

Znam da je problem "glup" ali na žalost tako je kako je :/
Potpis
F
Re: Dva .dll-a sa istim nazivom ali nisu isti 10.12.2015. u 12:36 · pre 132 meseci #8
Pretpostavljam da koristiš neki eksterni .exe file (program koji koristi openssl sa svojim dll-ovima) kome prosleđuješ parametre za fiskalizaciju ili šta već, i on ti se nalazi u direktorijumu gde i program.

U koliko je tako, premesti sve u neki drugi poddirektorijum u ubaci u njega taj exe i dll-fajlove koji njemu pipadaju, tako da će ti indy-jevi dll-ovi ostati u rutu tvog programa, i promeni putanju za pozivanje exe fajla u ShellExecute ili kako već pozivaš.
Potpis
Nikad izvini!
Re: Dva .dll-a sa istim nazivom ali nisu isti 10.12.2015. u 14:55 · pre 132 meseci #9
Da barem koristim neki drugi .exe. Sve je u jednom .exe-u. Znači iz mog programa radim fiskalizaciju i iz mog programa radim prijavu gostiju (koja koristi taj drugi .dll)...
Potpis
F
Re: Dva .dll-a sa istim nazivom ali nisu isti 10.12.2015. u 17:28 · pre 132 meseci #10
Hoce li raditi ako pre odredjenog zadatka (fiskalizacija ili prijava gostiju) sam ucitas odgovarajuci DLL? Onda nije bitno gde se nalazi, a ti vec znas kad ce ti koji trebati - ne bas tacno, ali ako pokrenes "proceduru" za fiskalizaciju, znas da ce ti do kraja procedure trebati odredjeni DLL.

Isto tako i za prijavu gostiju - npr. kad korisnik klikne na dugme za prijavu (ili kako god, sustina je da imas mogucnost da odredis pocetak procedure), ti ucitas DLL, pa nastavis dalje. Na kraju, uradis FreeLibrary(), i `ajde Jovo nanovo :)

E sad, ako postoji mogucnost da se te dve procedure pokrenu manje-vise istovremeno, onda je to novi problem, u suprotnom bi trebalo da radi.

A sumnjam da ti Indy fajlovi nemaju nikakve veze sa OpenSSL-om (interesovalo bi me da vidim gde si to nasao), ali znam da su neke starije verzije Indy-ja koristile "dopravljene" verzije originalnih DLL-ova. To zaista moze predstavljati problem, ako koristis razlicite biblioteke (cak i razlicite verzije Indy-ja) koje zahtevaju razlicite DLL-ove (sto je kod tebe, izgleda, slucaj).

Eventualno, ako imas vremena, mozes probati da nadjes fajlove koji ce raditi za obe biblioteke, mada je pitanje da li, u tvom slucaju, takvi postoje.

Kao solomonsko (ali ipak) resenje, ako nista ne pomaze, uvek mozes razdvojiti delove aplikacije, pa da svaki deo ima odgovarajuci DLL kraj sebe :P Ipak, nadam se da za tim nece biti potrebe.
Re: Dva .dll-a sa istim nazivom ali nisu isti 11.12.2015. u 10:57 · pre 132 meseci #13
Ako tvoja verzija Indy-ja podrzava (ima) IdOpenSSLSetLibPath() funkciju koju je Almedin preporucio, onda ti je to, mislim, zaista najelegantnije resenje. U suprotnom, LoadLibrary/FreeLibrary bi trebalo da ti zavrsi posao. `Ajd`, pa javi sta si napravio :)
Re: Dva .dll-a sa istim nazivom ali nisu isti 11.12.2015. u 16:41 · pre 132 meseci #14
Citat:
captPicard:
Ljudi puno hvala na odgovorima, danas isprobam opcije i od Bug-a i od Almedina pa javim :)


Meni su oba rjesenja, koja sam predložio, radila.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme