|
|
Milyen függvények vannak egy DLL-ben?
|
|
Példaprogram letöltése
8380 bájt
|
E példában egy olyan komponenst készítünk, mely képes arra, hogy egy property-jében megadott DLL állományból előszedje az összes olyan DLL-ben lévő függvény nevét, mely kívülről is elérhető. Ettől kezdve a DLL bármelyik függvényét használhatjuk saját programunkból is, ha tudjuk az adott függvény paraméter listáját.

A mellékelt példaprogram megnyitása előtt az ExportList.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens használatához annak DllFileName nevű property-jében kell megadni a DLL állomány nevét, elérési útvonallal. Ezt követően a DLL-ben lévő függvények máris kiolvashatók a Functions nevű TStringList típusú property-ből.
Nézzük a megvalósítást: ha a megadott állomány létezik, akkor állunk neki csak a függvény nevek kiolvasásához.
if FDllFileName<>'' then begin
if FileExists(FDllFileName) then begin
A MapAndLoad függvénnyel fogjuk megnyitni és betölteni az adott DLL-t, a megnyitást csak olvashatóként tesszük meg. Eredményül egy LoadedImage típusú struktúra kerül feltöltésre, mely a további munkánkhoz lesz szükséges.
if MapAndLoad(PChar(FDllFileName), nil, @li, true, true) then begin
try
A következő lépésben az ImageDirectoryEntryToData függvényt hívjuk meg, hogy lekérdezhessük a DLL-ben lévő exportált függvények leírását adó adatterületet. Ehhez első paraméterként az adatok bázis címét kell megadni, mely az előbbi függvényhívásunk LoadImage struktúrájában adott a MappedAddress mezőben.
A függvény harmadik paramétere a lekérdezendő adatot adja meg, mivel minket most az exportált függvény lista érdekel, így az IMAGE_DIRECTORY_ENTRY_EXPORT konstanst használjuk, de ha arra lennénk kíváncsiak, hogy a DLL milyen más DLL által szolgáltatott függvényeket használ, akkor az IMAGE_DIRECTORY_ENTRY_IMPORT konstanst kellene használnunk. További lehetőségeket az alábbi táblázat foglalja össze:
| Konstans |
Leírás |
| IMAGE_DIRECTORY_ENTRY_EXPORT |
Export directory |
| IMAGE_DIRECTORY_ENTRY_IMPORT |
Import directory |
| IMAGE_DIRECTORY_ENTRY_RESOURCE |
Resource directory |
| IMAGE_DIRECTORY_ENTRY_EXCEPTION |
Exception directory |
| IMAGE_DIRECTORY_ENTRY_SECURITY |
Security directory |
| IMAGE_DIRECTORY_ENTRY_BASERELOC |
Base relocation table |
| IMAGE_DIRECTORY_ENTRY_DEBUG |
Debug directory |
| IMAGE_DIRECTORY_ENTRY_ARCHITECTURE |
Architecture-specific data |
| IMAGE_DIRECTORY_ENTRY_GLOBALPTR |
Relative virtual address of global pointer |
| IMAGE_DIRECTORY_ENTRY_TLS |
Thread local storage directory |
| IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG |
Load configuration directory |
| IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT |
Bound import directory |
| IMAGE_DIRECTORY_ENTRY_IAT |
Import address table |
| IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT |
Delay import table |
| IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR |
COM descriptor table |
A függvény sikeres futása esetén egy ImageExportDirectory struktúrára mutató pointert ad vissza.
ied:=ImageDirectoryEntryToData(li.MappedAddress, false, IMAGE_DIRECTORY_ENTRY_EXPORT, a);
if ied<>nil then begin
Felhasználva a kapott adatot, most már elérhetjük az exportált függvények neveit. Ehhez az ImageRvaToVa függvényt használjuk.
wa:=ImageRvaToVa(li.FileHeader, li.MappedAddress, DWORD(ied^.AddressOfNames), ish);
Most már közvetlenül tudjuk olvasni a neveket, melyhez egy ciklust használunk, hogy az összes függvény nevet kiolvashassuk. A ciklusmagban az egyes nevek lekérdezéséhez ismét az ImageRvaToVa függvény ad segítséget ehhez.
for i := 0 to ied^.NumberOfNames-1 do begin
FFunctions.Add(PChar(ImageRvaToVa(li.FileHeader, li.MappedAddress, wa^[i], ish)));
end;
end;
finally
UnMapAndLoad(@li);
end;
end;
end;
end;
|
Cikksorozat
| 2591 | Windows | Tippek és trükkök - RAS - Modem csengetési szám állítása | 1. rész |
| 2622 | Windows | Tippek és trükkök - Program futtatása más felhasználóként | 2. rész |
| 2640 | Windows | A Windows ikonméretének megváltoztatása és Windows 2000 Asztaltémák | 3. rész |
| 2657 | Windows | Tippek és trükkök - Internet Explorer | 4. rész |
| 2667 | Windows | Tippek és trükkök | 5. rész |
| 2684 | Windows | Alapértelmezések állítása, telepítési fájlok helye, intéző nézetek | 6. rész |
| 2696 | Windows | Biztonsági trükkök | 7. rész |
| 2702 | Windows | Windows XP trükkök | 8. rész |
| 2729 | Windows | Windows 2000 és XP tippek, trükkök | 9. rész |
| 2757 | Windows | Registry trükkök | 10. rész |
| 2784 | Windows | Tippek, trükkök | 11. rész |
| 2829 | Windows | Tippek, trükkök | 12. rész |
| 2889 | Windows | Windows XP tippek | 13. rész |
| 2909 | Windows | Tippek Windows XP-hez | 14. rész |
| 2919 | Windows | Windows tippek | 15. rész |
| 2924 | Windows | Windows tippek | 16. rész |
| 2963 | Windows | Windows tippek | 17. rész |
| 2973 | Windows | Windows Tippek | 18. rész |
| 2981 | Windows | Windows tippek | 19. rész |
| 2990 | Windows | Tippek-trükkök | 20. rész |
| 3027 | Windows | IIS tippek | 21. rész |
| 3034 | Windows | Windows XP tippek-trükkök | 22. rész |
| 3088 | Windows | Windows 2000/XP tippek, trükkök | 23. rész |
| 3133 | Windows | Windows XP tippcsokor | 24. rész |
| 3140 | Windows | Windows XP tippek, trükkök | 25. rész |
| 3152 | Windows | XP és IIS tippek - trükkök | 26. rész |
| 3158 | Windows | Windows XP tippek, trükkök | 27. rész |
| 3168 | Windows | Tippek, trükkök | 28. rész |
| 3170 | Windows | Registry trükkök | 29. rész |
| 3179 | Windows | Tippek, trükkök | 30. rész |
| 3197 | Windows | Windows XP tippek, trükkök | 31. rész |
| 3205 | Windows | Tippek, trükkök | 32. rész |
| 3214 | Windows | Tippek, trükkök | 33. rész |
| 3223 | Windows | Tippek, trükkök | 34. rész |
| 3233 | Windows | Tippek, trükkök | 35. rész |
| 3271 | Windows | Tippek, trükkök | 36. rész |
| 3307 | Windows | Tippek, trükkök | 37. rész |
| 3370 | Windows | Tippek, trükkök | 38. rész |
| 3399 | Windows | Tippek, trükkök | 39. rész |
| 3510 | Windows | Tippek, trükkök | 40. rész |
| 3611 | Windows | Hardverrel kapcsolatos tippek, trükkök | 41. rész |
| 3668 | Windows | Registry trükkök | 42. rész |
| 3711 | Windows | Tippek, trükkök | 43. rész |
| 3771 | Windows | Tippek, trükkök | 44. rész |
| 3801 | Windows | Tippek, trükkök | 45. rész |
| 3831 | Windows | Tippek, trükkök | 46. rész |
| 3891 | Windows | Tippek, trükkök | 47. rész |
| 3921 | Windows | Tippek, trükkök | 48. rész |
| 3981 | Windows | Tippek, trükkök | 49. rész |
| 4041 | Windows | Tippek, trükkök | 50. rész |
| 4071 | Windows | Tippek, trükkök | 51. rész |
| 4151 | Windows | Tippek, trükkök | 52. rész |
| 4171 | C# | Tippek, trükkök | 53. rész |
| 4211 | Windows | Tippek, trükkök | 54. rész |
| 4251 | Windows | Tippek, trükkök | 55. rész |
| 4281 | Windows | Tippek, trükkök | 56. rész |
| 3589 | Delphi | Tippek, trükkök | 57. rész |
| 3718 | Delphi | Tippek, trükkök | 58. rész |
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2002 évkönyv 369. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|