c ++ - Kan jeg ændre navnet på en dll for at indlæse ved kørsel?

Indlæg af Hanne Mølgaard Plasc

Problem



Sig jeg har en dll navngivet middle.dll, der importerer funktioner fra runme.dll


Jeg har nu en erstatning runmeDBG.dll, der har alle de samme funktioner, der eksporteres som runme.dll


Er der en måde at bruge middle.dll på, men har den link til de funktioner, der eksporteres fra runmeDBG.dll i stedet for runme.dll?


Jeg kan ændre koden for middle.dll, men kender ikke navnet på dll'en, der vil indeholde de funktioner, der skal bruges, når jeg bygger middle.dll.


(Og alt dette i forbindelse med C/C ++ og Mingw værktøjssættet)

Bedste reference


Jeg antager middle.dll er ikke din, og den forbinder statisk med runme.dll. Nej, der er ingen måde at ændre dll navn i tilfælde af statisk forbindelse; Du kan dog omdøbe runmeDBG.dll til runme.dll og placere det et sted hvor dll loader finder den. Eller brug en manifest til at pege eksekverbar lige til den specifikke sti. Det er ikke et krav, at runme.dll sidder ind på en bestemt vej, er det?

Andre referencer 1


Hvis du har adgang til alle funktionerne i DLL'en via brug af GetProcAddress, så ja, du kan slukke hvilket modul du bruger på kørselstidspunktet. Læg blot det alternative modul (se LoadLibrary) og brug dets håndtag som argumentet til GetProcAddress.


Du vil ikke bruge dette, for også importen vil det dog blive meget kedeligt!

Andre referencer 2


Du skal bare omdøbe udskiftningen og sætte den i samme mappe som din eksekverbare.

Andre referencer 3


Dette spørgsmål er gammelt, men jeg fandt det først i Google, da jeg mødte et meget lignende problem, og så fandt jeg en bedre løsning andetsteds. Her er løsningen, jeg fandt det, forklaret i en anden tråd: Forsinkelse læser DLL'er.


Hvordan omdøber jeg en DLL, men tillader EXE at finde den?


Denne teknik kan være nyttig, hvis en DLL for eksempel blev designet til at blive linket statisk (med klasser i grænsefladen), men du skal faktisk indlæse den dynamisk uden at ændre dens grænseflade. Du skal blot fortælle Windows for at forsinke indlæse DLL'en, og når den faktisk indlæser DLL'en, kalder Windows din preloadkrog, og så returnerer du bare en håndtag til en anden DLL (som måske har et andet navn), der har samme interface.