![]() |
Re: WINAPI-Funktionen Windows Versionsabhängig
Zitat:
BTW: Es gibt keine if-Schleifen ;) |
Re: WINAPI-Funktionen Windows Versionsabhängig
Du könntest dir maximal dein eigenes GetProcAddress schreiben. Aber das fällt für mich kaum unter "sinnvoll". Da bist du so viel schneller. Oder vielleicht.... also eine WinAPI-Funktion gibt es nicht. Du müsstest, dann ja eine Liste übergeben. und eine Liste zurückbekommen.
IF-Schleifen :ouch:RoterKasten |
Re: WINAPI-Funktionen Windows Versionsabhängig
Zitat:
|
Re: WINAPI-Funktionen Windows Versionsabhängig
Du kannst dir maximal eine Funktion bauen, dir die eine Liste füllt o.ä. (je nachdem wie flexibel du die funktionen brauchst):
Delphi-Quellcode:
function getProcList(lib:Integer;const FunctionNames:TStringlist):boolean;
var i:integer; addr:pointer; begin result:=true; for i:=0 to Functionnames.count-1 do begin addr:=getprocaddress(lib,pchar(functionNames.names[i])); if addr=nil then begin result:=false; exit; end; Functionnames.ValueFromIndex[i]:=inttostr(integer(addr)); end; end; |
Re: WINAPI-Funktionen Windows Versionsabhängig
Hallo Sirius, das wäre eine Idee. Ich lasse mir die mal durch den Kopf gehen. Ich danke Dir schonmal für den Denkanstoss. :coder2:
|
Re: WINAPI-Funktionen Windows Versionsabhängig
Und wenn wir bei optimieren sind: Jedesmal getprocaddress neu anstoßen, bedeutet ja auch jedesmal die Tabelle mit den Exporteinträgen von vorne durchwühlen, bis die strings übereinstimmen. Da kann man natürlich auch einmal durchgehen. Hier allerdings bis zum bitteren Ende, ob das Vorteile bringt :gruebel:
Delphi-Quellcode:
function getProcList(libs:array of hModule;const FunctionNames:TStringlist):boolean;
var Exp:PImageExportDirectory; i,a:integer; name:string; addr:pointer; index:integer; listfilled:integer; lib:integer; begin try listfilled:=0; for a:=0 to high(libs) do begin lib:=libs[a]; //a-te Library aus libs lesen if (lib=0)or (PWord(pointer(lib))^<>$5A4D)or (PImageNTHeaders(PImageDosHeader(pointer(lib))^._lfanew+lib)^.Signature<>$4550) then continue; //ist keine Win-DLL/EXE //ExportTabelle finden Exp:=pointer(PInteger(@PImageNTHeaders(PImageDosHeader(pointer(lib))^._lfanew+lib)^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT])^+lib); //alle Export-Einträge durchlaufen for i:=0 to exp^.NumberOfNames-1 do begin //Name der i-ten Export-Funktion name:=pchar(pinteger(integer(exp^.AddressOfNames)+lib+i*4)^+lib); //Name in Liste suchen index:=Functionnames.IndexOfName(name); if index>=0 then begin //Adresse der i-ten Export-Funktion addr:=pointer(pinteger(integer(exp^.AddressOffunctions)+lib+i*4)^+lib); //Adresse in Liste speichern Functionnames.ValueFromIndex[index]:=inttostr(integer(addr)); inc(listfilled); end; end; end; result:=listfilled=Functionnames.Count; except result:=false; //was auch immer end; end; procedure TForm1.Button1Click(Sender: TObject); var list:TStringlist; begin list:=TStringlist.create; list.Add('CreateWindowExA='); list.Add('CreateWindowExW='); list.add('GetProcAddress='); if getProcList([getmodulehandle('user32.dll'), getmodulehandle('kernel32.dll')], list) then memo1.lines.addstrings(list); end; |
Re: WINAPI-Funktionen Windows Versionsabhängig
Du kannst auch die JEDI API verwenden. Die macht, wenn dynamisch compiliert, das alles automatisch für dich. Es wird tatsächlich nur einmal geladen.
Man muss nur überprüfe, ob der Funktionspointer nicht nil ist oder einfach try/except verwenden, wenn die Fkt aufgerufen wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz