Pascal und C++ unteschiedliches Ergebnis
Pascal und C++ unteschiedliches Ergebnis
Hallo Gurus,
Das ganze ist nur als Lernzweck.
ich habe hier "meiner Ansicht nach" den gleichen Code in Pascal und C++, aber das letzte Ergebnis ist unterschiedlich. Ich tendiere dass es in C++ eher korrekt ist.
* Warum ist der Errorcode unterschiedlich?
* Warum kann der Imagelist nicht gelesen werden, ob eine Imagelist an Toolbar geknüpft ist?
Zum Einsatz ist es FPC 3.2.2 und Lazarus IDE 2.2.6 und Visual C++ 2022.
Beim Pascal ist der Errorcode 0 ist.
Bei C++ ist der ErrorCode 6, ich vermute Errorcode 6 müsste richtig sein.
Das ganze ist nur als Lernzweck.
ich habe hier "meiner Ansicht nach" den gleichen Code in Pascal und C++, aber das letzte Ergebnis ist unterschiedlich. Ich tendiere dass es in C++ eher korrekt ist.
* Warum ist der Errorcode unterschiedlich?
* Warum kann der Imagelist nicht gelesen werden, ob eine Imagelist an Toolbar geknüpft ist?
Zum Einsatz ist es FPC 3.2.2 und Lazarus IDE 2.2.6 und Visual C++ 2022.
Beim Pascal ist der Errorcode 0 ist.
Bei C++ ist der ErrorCode 6, ich vermute Errorcode 6 müsste richtig sein.
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 359
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Pascal und C++ unteschiedliches Ergebnis
Hi!
GetLastError ist in Unit Windows definiert als: external 'kernel32' name 'GetLastError', d.h. es dürfte nichts geben, was deinen ErrorCode verfälscht.
Aber ich habe gerade gesehen, dass es SendMessage() zweimal gibt, in Unit Windows und in LCLIntf.
Nur in Unit Windows ist es als direkter Systemaufruf definiert: external 'user32' name 'SendMessageA'.
Probier mal aus, deine SendMessage-Aufrufe so zu schreiben: Windows.SendMessage(...) und vielleicht vorsichtshalber auch Windows.GetLastError;
Grüße, Jörg
GetLastError ist in Unit Windows definiert als: external 'kernel32' name 'GetLastError', d.h. es dürfte nichts geben, was deinen ErrorCode verfälscht.
Aber ich habe gerade gesehen, dass es SendMessage() zweimal gibt, in Unit Windows und in LCLIntf.
Nur in Unit Windows ist es als direkter Systemaufruf definiert: external 'user32' name 'SendMessageA'.
Probier mal aus, deine SendMessage-Aufrufe so zu schreiben: Windows.SendMessage(...) und vielleicht vorsichtshalber auch Windows.GetLastError;
Grüße, Jörg
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Pascal und C++ unteschiedliches Ergebnis
Zuerst sollte man in Erfahrung bringen, was die richtige Error Nummer ist laut API. Das GetLastError bezieht sich IMHO auf den letzten Call der API bei Windows, daher streng genommen auf den letzten Call von SendMessage. Die Frage ist, ob der Error nicht früher passiert ist.
https://learn.microsoft.com/de-de/windo ... tlasterror
Edit: Stimmt, in der LCLIntf wird das an das Widgetset weitergereicht, wie ich gerade gesehen habe. Das Widgetset (In Interfacebas.pp und über Compilermagic ) bindet aber die WinAPI.inc auch direkt ein. Also sollten beide Aufrufe direkt in der API von Windows enden.
https://learn.microsoft.com/de-de/windo ... tlasterror
Die Windows Unit legt sich da direkt über die API:Der Rückgabewert ist der letzte Fehlercode des aufrufenden Threads.
...
Einige Funktionen legen jedoch auch den letzten Fehlercode fest, wenn sie erfolgreich sind. Wenn die Funktion nicht dokumentiert ist, um den Code des letzten Fehlers festzulegen, ist der von dieser Funktion zurückgegebene Wert einfach der letzte Fehlercode, der festgelegt wurde. Einige Funktionen legen den Code des letzten Fehlers bei Erfolg auf 0 fest, andere nicht.
Code: Alles auswählen
function SendMessage(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM):LRESULT; external 'user32' name 'SendMessageA';
function GetLastError:DWORD; external 'kernel32' name 'GetLastError';
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Pascal und C++ unteschiedliches Ergebnis
Es hat sich leider nix verändert.Jorg3000 hat geschrieben: Do 7. Sep 2023, 04:35 Hi!
GetLastError ist in Unit Windows definiert als: external 'kernel32' name 'GetLastError', d.h. es dürfte nichts geben, was deinen ErrorCode verfälscht.
Aber ich habe gerade gesehen, dass es SendMessage() zweimal gibt, in Unit Windows und in LCLIntf.
Nur in Unit Windows ist es als direkter Systemaufruf definiert: external 'user32' name 'SendMessageA'.
Probier mal aus, deine SendMessage-Aufrufe so zu schreiben: Windows.SendMessage(...) und vielleicht vorsichtshalber auch Windows.GetLastError;
Grüße, Jörg
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 359
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Pascal und C++ unteschiedliches Ergebnis
Deine Quellcodes unterscheiden sich in der Zeile toolbarHandle:=... einmal MT4_TB_STANDARD, einmal TOOLBARCLASSNAME
Re: Pascal und C++ unteschiedliches Ergebnis
Danke für den Hinweis. MT4_TB_STANDARD ist wie folgt definiert. Ich wusste nicht dass in defines unit TOOLBARCLASSNAME ebenfalls definiert ist.Jorg3000 hat geschrieben: Do 7. Sep 2023, 10:04 Deine Quellcodes unterscheiden sich in der Zeile toolbarHandle:=... einmal MT4_TB_STANDARD, einmal TOOLBARCLASSNAME
Code: Alles auswählen
const
MT4_TB_STANDARD = 'ToolbarWindow32';
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 359
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Pascal und C++ unteschiedliches Ergebnis
Übrigens,
in der Windows-Doku zu TB_GETIMAGELIST lese ich nichts von einem Fehlercode. https://learn.microsoft.com/en-us/windo ... timagelist
Könnte es sein, dass der GetLastError, den du in C++ bekommst, gar nichts damit zu tun hat?
Vielleicht liegt das Problem irgendwo anders und lässt sich gar nicht durch GetLastError eingrenzen.
in der Windows-Doku zu TB_GETIMAGELIST lese ich nichts von einem Fehlercode. https://learn.microsoft.com/en-us/windo ... timagelist
Könnte es sein, dass der GetLastError, den du in C++ bekommst, gar nichts damit zu tun hat?
Vielleicht liegt das Problem irgendwo anders und lässt sich gar nicht durch GetLastError eingrenzen.
Re: Pascal und C++ unteschiedliches Ergebnis
Vielen Danke für Eure Hilfe der Analyse.
Ich habe den Fehler gefunden. Ich habe nun gang oben vor Aufrufe der gesamten API Funktionen, SetLastError( 0 ) gesetzt, dann habe ich den gleichen Code erhalten, d.h. also bei fehlerfreie Aufrufe der API Funktion wird der LastError gar nicht zurückgesetzt.
Ich habe den Fehler gefunden. Ich habe nun gang oben vor Aufrufe der gesamten API Funktionen, SetLastError( 0 ) gesetzt, dann habe ich den gleichen Code erhalten, d.h. also bei fehlerfreie Aufrufe der API Funktion wird der LastError gar nicht zurückgesetzt.