Ĺadny brzuch
Witam.
Nie moge zrozumieć, kiedy lepiej uzyć statycznego załadowania biblioteki DLL a kiedy dynamicznego. Czy jedynym aspektem tego jest tu pamięć kompyutera? Przeciez jak ładuje statycznie to tak czy siak tyle samo pamięci jest uzytej, i czy ma znaczenie czy dłużej się uzywa tej ilosci pamięci ?
Tylko proszę bez zjeżdżania mnie o lamerstwo itp....
Użytkownik programista1101 edytował ten post 23 kwiecień 2005, 21:19
Rozwazmy taki przyklad:
Masz dll ktora zawiera np. funkcje (albo forme) wywolywana gdy user kliknie opcje "rejestracja".
Wydaje mi sie ze ladowanie jej statyczne nie bylo by dobrym pomyslem bo przeciez nie ma pewnosci kiedy bedzie potrzebna wiec po co zasmiecac pamiec. Lepiej zaladowac ja dynamicznie wtedy kiedy bedzie naprawde niezbedna (czyt. user kliknie opcje "rejestracja").
PS. oczywiscie moge sie mylic
Użytkownik Poszukiwacz edytował ten post 23 kwiecień 2005, 21:37
Ładuj statycznie. Dynamiczne przydatne może być przy powiedzmy puginach. Nie ma żadnych przeciwskazań do ładowania statycznego. Z dynamicznym trzeba się trochę męczyć i efekt nie jest tego warty.
Jak pisałem dynamiczne dla PlugInów itd.
Zależy od tego, czy user będzie często używał tej funkcji, czy np. tylko na jakiś czas. Jeśli gościu często będzie tego używał, bo wprawdzie zajmie więcej pamięci, ale będzie ładować się tylko raz, więc nie będzie trzeba długo czekać. Jeśli znowu tylko raz na jakiś czas (np. Rejestracja), to aduj dynamicznie. Będzie wolniej się ładować, ale mniej pamięci zajmowac :excl:
Eee... ja się może nie znam na Delphi, ale co ma ładowanie DLLi do zużycia pamięci przez program? Statyczne ładowanie DLLa to AFAIK linkowanie się z nim na poziomie kompilacji, więc adresy wszystkich funkcji, których z niego potrzebujesz są na stałe wpisane w program. Dynamiczne linkowanie to użycie funkcji API LoadLibrary i GetProcAdress do pobrania adresu jakiejś funkcji. Po wywołaniu LoadLibrary pamięć zajmowana przez DLL w systemie operacyjnym jest i tak taka sama, jak przy statycznym zlinkowaniu.
Co do braku efektu przy dynamicznym linkowaniu - efekt jest nawet lepszy, tylko trzeba wiedzieć jak go stosować. W C++ [Delphi nie znam] robisz sobie [wspólny dla DLLa i programu] interfejs [czysto wirtualną klasę bez danych]. Po strone DLLa robisz sobie jakąś klasę, która po nim dziedziczy, robisz jej obiekt globalny, i piszesz zwykłą funkcję, która zwraca ten obiekt jako wskaźnik na interfejs [ew. na void]. Po stronie programu robisz GetProcAdress tej funkcji, rezultat rzutujesz na wspólny interfejs, i już masz w pełni Zorientowaną Obiektowo komunikację między DLLem a programem. Tak zresztą robi się pluginy :)
Linkowanie dynamiczne jest trudniejsze, bo musisz się bawić w to, co opisałem powyżej. Niemniej linkowanie statyczne nie pozwala Ci na podmianę DLLi programu, bo wtedy adresy funkcji będą się różnić. Dlatego jeśli nie potrzebujesz możliwości zamiany DLLa bez rekompilacji, wybierz statyczne; w przeciwnym razie dynamiczne.
Pozdrawiam,
TeMPOraL.
Użytkownik TeMPOraL edytował ten post 24 kwiecień 2005, 09:10
Krotko mowiac : statyczne ladowanie zasmieca pamiec, ale jesli na wiecje niz 50% skozystasz z dll to lepiej statycznie. Dynamiczne jest dobre do pluginow, oraz w sytuacjach gdy nie jestes pewien czy user posiada biblioteczke (np. jak chcesz recznie zrobic alpha-blending, tzn. przez komunikaty, to powinienes ladowac dynamicznie, dzieki temu jak odpalisz na 98 to nie bedzie alpha blendingu - a jak ustawisz dynamicznie to sie progs nie odpali). Rowniez warto ladowac dynamicznie jesli funkcja jest uzywana b. zadko, jak podana przez Poszukiwacza rejestracja :)
HNB: nie takie trudne : spojrz na najprostszy kod :) type TMainProc=procedure(txt:Pchar); var proc:TMainProc; hnd:THandle; begin hnd:=LoadLibrary(filename); @proc:=GetProcAddress(hnd,'glowna_procka'); if @proc<>nil then proc('hello world'); FreeLibrary(hnd);
w tym przykladzie do procki glownej (o eksportowej nazwie 'glowna_procka') dllki (o nazwie filename) zostanie przekazany tekst 'hello world'. Trudne?
Aha: nie przekazujcie miedzy dllkami stringow!
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Nie moge zrozumieć, kiedy lepiej uzyć statycznego załadowania biblioteki DLL a kiedy dynamicznego. Czy jedynym aspektem tego jest tu pamięć kompyutera? Przeciez jak ładuje statycznie to tak czy siak tyle samo pamięci jest uzytej, i czy ma znaczenie czy dłużej się uzywa tej ilosci pamięci ?
Tylko proszę bez zjeżdżania mnie o lamerstwo itp....
Użytkownik programista1101 edytował ten post 23 kwiecień 2005, 21:19
Rozwazmy taki przyklad:
Masz dll ktora zawiera np. funkcje (albo forme) wywolywana gdy user kliknie opcje "rejestracja".
Wydaje mi sie ze ladowanie jej statyczne nie bylo by dobrym pomyslem bo przeciez nie ma pewnosci kiedy bedzie potrzebna wiec po co zasmiecac pamiec. Lepiej zaladowac ja dynamicznie wtedy kiedy bedzie naprawde niezbedna (czyt. user kliknie opcje "rejestracja").
PS. oczywiscie moge sie mylic
Użytkownik Poszukiwacz edytował ten post 23 kwiecień 2005, 21:37
Ładuj statycznie. Dynamiczne przydatne może być przy powiedzmy puginach. Nie ma żadnych przeciwskazań do ładowania statycznego. Z dynamicznym trzeba się trochę męczyć i efekt nie jest tego warty.
Jak pisałem dynamiczne dla PlugInów itd.
Zależy od tego, czy user będzie często używał tej funkcji, czy np. tylko na jakiś czas. Jeśli gościu często będzie tego używał, bo wprawdzie zajmie więcej pamięci, ale będzie ładować się tylko raz, więc nie będzie trzeba długo czekać. Jeśli znowu tylko raz na jakiś czas (np. Rejestracja), to aduj dynamicznie. Będzie wolniej się ładować, ale mniej pamięci zajmowac :excl:
Eee... ja się może nie znam na Delphi, ale co ma ładowanie DLLi do zużycia pamięci przez program? Statyczne ładowanie DLLa to AFAIK linkowanie się z nim na poziomie kompilacji, więc adresy wszystkich funkcji, których z niego potrzebujesz są na stałe wpisane w program. Dynamiczne linkowanie to użycie funkcji API LoadLibrary i GetProcAdress do pobrania adresu jakiejś funkcji. Po wywołaniu LoadLibrary pamięć zajmowana przez DLL w systemie operacyjnym jest i tak taka sama, jak przy statycznym zlinkowaniu.
Co do braku efektu przy dynamicznym linkowaniu - efekt jest nawet lepszy, tylko trzeba wiedzieć jak go stosować. W C++ [Delphi nie znam] robisz sobie [wspólny dla DLLa i programu] interfejs [czysto wirtualną klasę bez danych]. Po strone DLLa robisz sobie jakąś klasę, która po nim dziedziczy, robisz jej obiekt globalny, i piszesz zwykłą funkcję, która zwraca ten obiekt jako wskaźnik na interfejs [ew. na void]. Po stronie programu robisz GetProcAdress tej funkcji, rezultat rzutujesz na wspólny interfejs, i już masz w pełni Zorientowaną Obiektowo komunikację między DLLem a programem. Tak zresztą robi się pluginy :)
Linkowanie dynamiczne jest trudniejsze, bo musisz się bawić w to, co opisałem powyżej. Niemniej linkowanie statyczne nie pozwala Ci na podmianę DLLi programu, bo wtedy adresy funkcji będą się różnić. Dlatego jeśli nie potrzebujesz możliwości zamiany DLLa bez rekompilacji, wybierz statyczne; w przeciwnym razie dynamiczne.
Pozdrawiam,
TeMPOraL.
Użytkownik TeMPOraL edytował ten post 24 kwiecień 2005, 09:10
Krotko mowiac : statyczne ladowanie zasmieca pamiec, ale jesli na wiecje niz 50% skozystasz z dll to lepiej statycznie. Dynamiczne jest dobre do pluginow, oraz w sytuacjach gdy nie jestes pewien czy user posiada biblioteczke (np. jak chcesz recznie zrobic alpha-blending, tzn. przez komunikaty, to powinienes ladowac dynamicznie, dzieki temu jak odpalisz na 98 to nie bedzie alpha blendingu - a jak ustawisz dynamicznie to sie progs nie odpali). Rowniez warto ladowac dynamicznie jesli funkcja jest uzywana b. zadko, jak podana przez Poszukiwacza rejestracja :)
HNB: nie takie trudne : spojrz na najprostszy kod :) type TMainProc=procedure(txt:Pchar); var proc:TMainProc; hnd:THandle; begin hnd:=LoadLibrary(filename); @proc:=GetProcAddress(hnd,'glowna_procka'); if @proc<>nil then proc('hello world'); FreeLibrary(hnd);
w tym przykladzie do procki glownej (o eksportowej nazwie 'glowna_procka') dllki (o nazwie filename) zostanie przekazany tekst 'hello world'. Trudne?
Aha: nie przekazujcie miedzy dllkami stringow!