__stdcall oder __cdecl für SDK?
-
Ich bastel gerade ein SDK (reine C API), welches Kunden in diverse Projekte einbinden werden. Und halt Projekte die in verschiedensten Sprachen implementiert sind, u.a. Visual Basic Classic aber auch diverse andere Sprachen (Perl, Python). Und natürlich C und C++.
Das SDK gibt's 1x als static .lib und 1x als DLL.
Und jetzt frage ich mich: welche Calling Convention macht da eher Sinn,
__stdcall
oder__cdecl
? Also speziell wenn man dem Kunden es so einfach wie möglich machen möchte, also so dass er möglichst überall direkt unsere DLL hernehmen kann, und sich nicht nochmal selbst eine DLL bauen muss.Windows selbst verwendet ja
__stdcall
, daher würde ich vermuten dass die meisten Sprachen irgendwie__stdcall
DLLs unter Windows verwenden können.Falls hier jemand Erfahrung mit Dingen dieser Art hat... ich froh hierzu Meinungen oder sogar harte Fakten zu erfahren.
-
VB classic kann nur __stdcall, da ist die Wahl schon gefallen.
-
Danke.
Nein, die Wahl ist nicht automatisch gefallen nur weil VB Classic nur __stdcall kann. Die Nutzer des SDK können ja auch ne eigene Wrapper DLL machen um das SDK anzusprechen. Irgendwer wird das sowieso immer machen müssen, da es vermutlich für jede Möglichkeit ne Sprache/Technologie mit der es dann nicht ohne Umwege gehen wird.
Und wenn genug andere Gründe gegen__stdcall
bzw. für__cdecl
sprechen...
-
__stdcall wäre sofort meine Wahl.
-
OK, danke.
Würdest du dann die dekorierten
_foo@12
Namen verwenden oder per .def File auf einfach
foo
umbiegen?
-
Ich biege die Namen immer um. Ich benutze dazu meistens keine Def Datei sondern pragmas.
http://blog.m-ri.de/index.php/2008/02/22/vs-tipps-tricks-benoetigt-man-eigentlich-noch-def-dateien/
-
Cool, danke, das spart mir Arbeit
Nochwas: Bei den 64 Bit Builds ist ja soweit ich weiss
__stdcall==__cdecl
. Gibt es dann einen Grund im 64 Bit Build ebenfalls__stdcall
zu verwenden? Oder wäre es da sinnvoll bei 64 Bit einfach keine Calling Convention anzugeben? Oder wäre explizit__cdecl
bzw. explizit__fastcall
besser?
-
Habe ich noch nie so drüber nachgedacht. 64bit Komponenten habe ich wenige, aber da ist alles __stdcall. Fast alles dort benutzt Callbacks aus der WinAPI.
Das Umbiegen im C/C++ Code erlaubt es zumindest auch Code-nahe sofort Änderungen vorzunehmen, wenn sich Namen ändern.