Moin!
Wir haben also hier eine betriebssystemspezifische Schnittstelle zwischen verschiedenen Programmmodulen, die nicht auf jedem System überhaupt existieren muss und die auf einem gegebenen System (Linux, Windows) auch nicht von der verwendeten Programmiersprache C/C++ abhängig ist. Eine in Assembler/Delphi/VB geschriebene DLL hätte die gleiche Schnittstelle.
Inwiefern spielt denn an dieser Stelle die sogenannte Calling-Convention eine Rolle? Aus meinen Tagen der Windows-Programmierung sowohl mit C als auch Delphi kenne ich, dass C-Funktionen standardmäßig als „cdecl“ betrachtet werden, d.h. die Argumente an die Funktion werden in einer bestimmten Reihenfolge auf den Stack gelegt, so dass C-Funktionen eine variable Anzahl an Argumenten entgegennehmen können. Außerdem ist die C-Funktion selbst dafür verantwortlich, beim Rücksprung den Stack in einem ordentlichen Zustand zu hinterlassen. Delphi-Funktionen hingegen sind standardmäßig “pascal“, d.h. es kann nur eine bestimmte Zahl an Parametern übergeben werden und der Stack wird nicht von der Funktion aufgeräumt, sondern von … irgendjemand anderem. Beim Einbinden einer Bibliothek muss man im Quellcode immer angegeben, nach welcher Calling-Convention die entsprechenden Symbole aufgelöst werden sollen.
Viele Grüße,
Robert