Parameterübergabe einer CALL Back Routiene

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Parameterübergabe einer CALL Back Routiene

Beitrag von Lorca »

Hallo Zusammen,

Es geht um das Thema: Ressourcen DLL verarbeiten.
Dazu möchte die folgende Funktion aufrufen: function EnumResourceTypesW(hModule: HMODULE;
lpEnumFunc:ENUMRESTYPEPROCW;
lParam : LONG_PTR):WINBOOL; external 'kernel32' name 'EnumResourceTypesW';
Diese ist definiert im Include: unifun.inc und erwartet die Übergabe einer CALL Back Routiene. So jedenfalls verstehe ich diese Definition.

Leider mekkert mich der compiler an und teilt mir folgendes mit:
UI_FLMT.pas(148,92) Error: Incompatible type for arg no. 2: Got "LongBool", expected "<procedure variable type of function(QWord;PWideChar;Int64):LongBool;StdCall>"

Ich sehe den Wald vor lauter Bäumen nicht.
Die DLL ist bereits geladen und das Handle hat einen gültigen Wert.

Bei dem Parameter: lpEnumFunc:ENUMRESTYPEPROCW handelt es sich um eine CALL Back Funktion.
In meinem Coding habe ich diese (aus meiner Sicht korrekt) definiert: (oder liegt hier etwa mein Fehler?)

FUNCTION RES_CallBack_EnumTypes
( hModule : HMODULE;
lpszType : LPWSTR;
lParam : LONG_PTR ) : WINBOOL; STDCALL;
BEGIN
END ;


Der Aufruf sieht folgender maßen aus:

VAR lv_Param : Int64; lv_GlbHdl : HGLOBAL; lv_Type, lv_Name : Pwidechar
EnumResourceTypesW( lv_LibHDL,
RES_CallBack_EnumNames( lv_LibHDL, lv_Type, lv_Name, lv_Param)
lv_Param );


Vllt. kann ja jemand helfen?


Danke und Gruß

Lorca

chmod222
Beiträge: 14
Registriert: Do 19. Aug 2021, 17:29

Re: Parameterübergabe einer CALL Back Routiene

Beitrag von chmod222 »

Ich bin jetzt kein Experte was die WinAPI betrifft, aber für mich sieht das einfach danach aus als würdest du nicht korrekt den Funktionspointer für den Callback übergeben.

Die Funktion

Code: Alles auswählen

EnumResourceTypesW
erwartet an zweiter Stelle einen Zeiger auf eine Funktion vom Typ ENUMRESTYPEPROCW, welche in der WinAPI wie folgt definiert ist und die du meiner Ansicht nach auch korrekt in Pascal übersetzt hast:

Code: Alles auswählen

BOOL Enumrestypeprocw(
  HMODULE hModule,
  LPWSTR lpType,
  LONG_PTR lParam
)
Du übergibst an zweiter Stelle von EnumResourceTypesW jedoch das Ergebnis vom Aufruf der Funktion RES_CallBack_EnumNames, nicht die Funktion selber.

Korrekterweise müsste dein Aufruf in der Form

Code: Alles auswählen

EnumResourceTypesW(lv_GlbHdl, @RES_CallBack_EnumNames, ...)
sein, da EnumResourceTypesW deine Funktion ja für dich aufruft.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Parameterübergabe einer CALL Back Routiene

Beitrag von Winni »

Mal in der Unit system wühlen.

EnumResTypeProc
Callback for resource type enumeration

https://www.freepascal.org/docs-html/rt ... eproc.html

Grüße
Winni

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Parameterübergabe einer CALL Back Routiene

Beitrag von Lorca »

Hallo zusammen,

zunächst einmal ganz herzlichen Dank für eure nette Hilfe. :)

Eure Antworten haben mich dazu gebracht eine eigene Klasse zum Ressourcen einlesen zu machen.
Hier übergebe ich in dem Constructor die Funktionen ENUMRESTYPEPROC und ENUMRESNAMEPROC nach dem gleichen
Schema wie auch die Eventhandler

Nun klappt es mit den CALL Back Funktionen. :D
Jetzt tun sich jedoch weitere Probleme an einer anderen stelle auf. :(

Dazu werde ich jedoch einen neuen Threat erstellen.

Ich danke euch allen
Gruß
Lorca

Antworten