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
Parameterübergabe einer CALL Back Routiene
Re: Parameterübergabe einer CALL Back Routiene
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 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:
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 sein, da EnumResourceTypesW deine Funktion ja für dich aufruft.
Die Funktion
Code: Alles auswählen
EnumResourceTypesW
Code: Alles auswählen
BOOL Enumrestypeprocw(
HMODULE hModule,
LPWSTR lpType,
LONG_PTR lParam
)
Korrekterweise müsste dein Aufruf in der Form
Code: Alles auswählen
EnumResourceTypesW(lv_GlbHdl, @RES_CallBack_EnumNames, ...)
- 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
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
EnumResTypeProc
Callback for resource type enumeration
https://www.freepascal.org/docs-html/rt ... eproc.html
Grüße
Winni
Re: Parameterübergabe einer CALL Back Routiene
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.
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
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.
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