DLL und call convention
-
Hallo zusammen!
Ich hab mal gehört, man kann Klassen in DLLs nur mit verschiedenen C++-Compilern benutzen, wenn man sich an irgendwelche "calling conventions" hält. Ich hab da gar keine Ahnung und würde mich über einen Hinweis freuen, nach was ich denn suchen muss!
Die Problemstellung bei mir ist: Ich habe eine DLL mit einem Compiler geschrieben, aber will das auch anderen bei uns zur Verfügung stellen. Manche nutzen den VC++, manche DevC++, etc...
Vielen Dank für Eure Hilfe!!
Gruß,
Tobias
-
Das funktioniert generell nur, wenn beide Seiten mit dem gleichen Compiler gebaut wurden. Mir fällt zumindest keine Konstellation ein, wo es funktioniert.
Also: (!= verwende ich hier für "verträgt sich nicht")
VC++ != BCB
gcc != VC++
VC++6 != VC++7
gcc 3 != gcc 2
gcc 3.4 != gcc 3.3
gcc 4 != gcc 3usw.
Man muss sich außerdem Gedanken darüber machen, wie der Heap der DLL verwaltet wird. So kann man z.B. nicht ohne weiteres in der DLL new aufrufen und außerhalb der DLL das dazugehörige delete.
-
Ringding schrieb:
gcc 4 != gcc 3
Schade, aber es ist so ...
-
Ringding schrieb:
Das funktioniert generell nur, wenn beide Seiten mit dem gleichen Compiler gebaut wurden. Mir fällt zumindest keine Konstellation ein, wo es funktioniert.
Hm würd ich mal nicht sagen. Du musst halt schauen, wie due Aufrufkonvention ist. stdcall, PASCAL und was es da noch gibt. Google mal ein bisschen dann findest sicher genaueres

-
Nenn mir ein Beispiel, wo es funktioniert.
EDIT: Gut, mir fällt grad eins ein: C++Builder / Delphi. Aber das auch nur, weil Borland sich nicht die Mühe machen wollte, die VCL parallel in Delphi und in C++ zu implementieren. Somit ist ihnen nix anderes übriggeblieben, als die beiden irgendwie kompatibel zu machen.
-
Warum kann delphi oder Borland Builder dann Windows-DLLs benutzen? Glaube kaum das Windows mit diesen Produkten erstellt wurde ...
-
Hier geht's um Klassen in DLLs, nicht um DLLs an sich.
-
hum also ergo is das keine Standard-DLL ja?
dann geht das natürlich nicht, jo hast recht
-
Hallo zusammen!
Danke für die Antworten... ich werd mich mal nach diesem stdcall umsehen... und wenn es eh nicht geht, was anderes überlegen!
Gruß, Tobias