windows - Hvorfor lagrer rammerne deres egen HMODULE, når det kan hentes ved hjælp af \_\_ImageBase eller GetModuleHandleEx ()?

Indlæg af Hanne Mølgaard Plasc

Problem



Dette spørgsmål spørger, hvordan man henter håndtaget på DLL'en, der indeholder den aktuelt udførte kode. Et link i et af svarene antyder at tage adressen til \_\_ImageBase som modulhåndtag. Dette virker for mig. [11]


Mit spørgsmål er: I betragtning af at det er så forbavsende nemt at hente det nuværende moduls håndtag, hvorfor gemmer rammerne som MFC (og endda koden base jeg arvet) normalt forekomsthåndtaget til DllMain() i nogle globale variabler ? Er der en grund til ikke at stole på \_\_ImageBase?


Rediger : Ifølge Raymond Chen er \_\_ImageBase kun til Microsoft-linkere. Der er et andet spørgsmål, der har mere præcise svar, herunder en linker-uafhængig måde, der bruger GetModuleHandleEx(). Der er også en løsning til Win2000 og tidligere brug af VirtualQuery(). Spørgsmålet er fortsat gyldigt: Hvorfor gemmer baseadressen, når den let kan hentes? [13]

Bedste reference


\_\_ImageBase er et trick leveret af Microsoft linkeren og kan muligvis ikke fungere sammen med andre kompilatorer/linkere. Selvom rammen ikke understøtter andre værktøjer, kan de måske ikke vide om dette magiske symbol, så det er nok derfor ikke brugt meget. [15]


Det samme kan gøres i ren WinAPI med VirtualQuery eller GetModuleHandleEx(GET\_MODULE\_HANDLE\_EX\_FLAG\_FROM\_ADDRESS,...)