Vielen, herzlichen Dank für Eure Mühen, aber nach Stunden erfolgslosen Probierens stehe ich nunmehr
total auf dem Schlauch, wie ich es Delphi schon seit Jahren nicht mehr erlebte.
Anscheinend geht es in etwa darum, die Delphi-Kapselung vieler
API-Funktionen in Lazarus nachzubilden.
Ich versuche beispielhaft, die CreateToolhelp32Snapshot-Funktion zunächst erst einmal erfolreich aufzurufen, scheitere daran aber natürlich (konkret schon in der Zeile davor, in der ich die Beispielfunktion wertzuweisen beabsichtige):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
DLLHandle,hProcessSnap: THandle;
Beispielfunktion:
function(dwFlags:Integer;th32ProcessID:Integer):THandle;
//alternativ Funktionsergebnistyp:Pointer, mit dem klappt es aber auch nicht
begin
DLLHandle := LoadLibrary(kernel32);
if (DLLHandle < HINSTANCE_ERROR)
then showmessage('
DLL konnte nicht geladen werden!')
else
begin
Beispielfunktion := @GetProcAddress(DLLHandle, '
CreateToolhelp32Snapshot');
//klappt auch nicht, wenn ich das „@“ weglasse
//hProcessSnap:=CreateToolHelp32SnapShot(2{TH32CS_SNAPPROCESS},0);
FreeLibrary(kernel32)
end
end;
An die Kryptigkeit der Fehlermeldungen habe ich mich auch längst gewöhnt, aber vor
Delphi-Quellcode:
unit1.pas(38,25) Error: Incompatible types: got "<address of function(LongInt, AnsiString):^untyped;Register>" expected "<procedure variable type of function(LongInt, LongInt):DWord;Register>"
unit1.pas(38,40) Fatal: Syntax error, ";" expected but "(" found
kapituliere ich. Um nur mal die zweite Fehlermeldung zu kommentieren: Warum darf ich GetProcAddress auf einmal nicht mehr mit Parametern aufrufen?
Ich begreife zudem nicht, was dieses ganze Rumgemache mit Loadlibrary und GetProcAddress überhaupt soll. Bisher lernte ich in Delphi die Aufrufe externer
DLL-Funktionen so kennen (hat bisher, bei mir jedenfalls,
immer so geklappt), Beispiel:
Delphi-Quellcode:
interface
function OpenThread(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;
implementation
function OpenThread; external kernel32 name 'OpenThread';