Das "
Handle" einer
DLL entspricht aktuell "zufällig" der Adresse im
RAM (bei
Win32 ... 64 weiß ich nicht)
und so lange die
DLL immer an der selben Stelle geladen wird, bleibt sie auch dort.
Außerdem, wenn die
DLL beim FreeLibrary nicht freigegeben wird, weil z.B. noch ein anderes
Handle drauf zeigt (Referenzzählung), dann lädt das nächste LoadLibrary auch nicht neu und bekommt das aktive
Handle.
Statt
LoadLibrary vorher einfach mal mit
GetModulHandle nachsehn, ob die schon/noch da ist.
Jede EXE/
DLL hat zwar eine LadeAdresse und würde "eigentlich" auch immer an der Stelle geladen, also hätte somit immer die selbe Adresse/
Handle bekommen,
ABER
* fast Alle Entwickler vergessen die zu setzen, somit steht die Vorgabe immer auf $00400000, was oft belegt ist (wenn mehrere EXE/
DLL die Gleiche haben) und somit verschoben wird
** allerdings hat Windows einen Cache und merkt es sich ... um nicht jedesmal neu die Reallocations neu zu berechnen
** dieser Cache sorgt auch dafür, dass mehrere Instanzen der
DLL in verschiedenen Programmen bzw. Programminstanzen (Programm mehrmals gestartet) auch "möglichst" die selbe Adresse haben (gemeinsam genutzter Speicher)
http://docwiki.embarcadero.com/RADSt...e-Basisadresse
* und man kann im Windows auch eine Sicherheitfunktion aktivieren, womit EXE und DLLs immer neu
zufällig positioniert werden, damit Hacker/Viren/Trojaner mit statischen Zeigern kein "leichtes" Spiel haben, z.B. durch einen billigen Bufferoverflow im Browser
Zitat:
aber ich lade unterschiedliche DLLs also sollte eigentlich das
Handle auch unterschiedlich sein.
so lange die Entwickler keinen Mist gebaut haben ... z.B. überall die gleiche ImageBase