Pascal und C++ unteschiedliches Ergebnis

Antworten
king558
Beiträge: 25
Registriert: So 27. Aug 2023, 16:44

Pascal und C++ unteschiedliches Ergebnis

Beitrag von king558 »

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.
Pascal-code-version.png
Pascal-code-version.png (168.72 KiB) 4847 mal betrachtet
Bei C++ ist der ErrorCode 6, ich vermute Errorcode 6 müsste richtig sein.
Cpp-code-version.png
Cpp-code-version.png (105.33 KiB) 4845 mal betrachtet

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 170
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Pascal und C++ unteschiedliches Ergebnis

Beitrag von Jorg3000 »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
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

Beitrag von af0815 »

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
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.
Die Windows Unit legt sich da direkt über die API:

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';    
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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

king558
Beiträge: 25
Registriert: So 27. Aug 2023, 16:44

Re: Pascal und C++ unteschiedliches Ergebnis

Beitrag von king558 »

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
Es hat sich leider nix verändert.
Pascal-code-version2.png
Pascal-code-version2.png (176.83 KiB) 4783 mal betrachtet

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 170
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Pascal und C++ unteschiedliches Ergebnis

Beitrag von Jorg3000 »

Deine Quellcodes unterscheiden sich in der Zeile toolbarHandle:=... einmal MT4_TB_STANDARD, einmal TOOLBARCLASSNAME

king558
Beiträge: 25
Registriert: So 27. Aug 2023, 16:44

Re: Pascal und C++ unteschiedliches Ergebnis

Beitrag von king558 »

Jorg3000 hat geschrieben:
Do 7. Sep 2023, 10:04
Deine Quellcodes unterscheiden sich in der Zeile toolbarHandle:=... einmal MT4_TB_STANDARD, einmal TOOLBARCLASSNAME
Danke für den Hinweis. MT4_TB_STANDARD ist wie folgt definiert. Ich wusste nicht dass in defines unit TOOLBARCLASSNAME ebenfalls definiert ist.

Code: Alles auswählen

const
  MT4_TB_STANDARD             = 'ToolbarWindow32';
hier habe ich es geändert, trotzdem selben Ergebnis.
Pascal-code-version3.png
Pascal-code-version3.png (45.01 KiB) 4738 mal betrachtet

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 170
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Pascal und C++ unteschiedliches Ergebnis

Beitrag von Jorg3000 »

Ü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.

king558
Beiträge: 25
Registriert: So 27. Aug 2023, 16:44

Re: Pascal und C++ unteschiedliches Ergebnis

Beitrag von king558 »

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.

Antworten