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


  • Mod

    __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?


  • Mod

    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?


  • Mod

    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.


Log in to reply