DLL- Kompatibilität unter Windows
-
Werte Forumsbesucher,
ich muß für eine Windows- Sache eine statische Lib in eine DLL umwandeln, was an und für sich kein Problem ist.
Die Frage lautet, wer hinterher was mit der DLL anfangen kann und da ist mir eine ungute Erinnerung hochgekommen:
Also eine mit VStudio (C/C++) erstellte DLL sollte in ein Borland- Projekt (C++) eingebunden werden. Ich hab' damals so rumgespielt und beim Compile ein paar hundert warnings und ein paar 'zig errors bekommen. Nachdem mir die je ersten drei Meldungen zu kryptisch waren, hab' ich jemand anderen rangesetzt, der sich für berufener hielt und gemeint hat, zumindest die DLL einbindefertig unter Borland compilieren zu können. Der hat aber dann auch aufgegeben, die Begründung hab' ich zwischenzeitlich vergessen.Wobei ich wiederum keine Probleme hatte, die DLL unter VStudios VBasic aufzulesen.
Wie ist das nun, kann man eine DLL nicht "einfach so" weitergeben oder sind die wirklich auf die eigene Compilerfamilie eingeschränkt?
Tut mir leid, so blöd zu fragen, aber an den PC muß ich eigentlich nur alle Jubeljahre und mit DLLs hab' ich mich bisher nur soweit befaßt, daß ich an Header dazuklick und der Rest geht (fast) von selbst.
Nur, wenn ich erstmal den Compiler desjenigen bräuchte, der meine DLL nutzen soll, wär' das ganze finanziell völlig uninteressant.
-
natürlich kann man das. mit irgendwelchem borland crap kennen wir uns hier ned aus und ohne fehlermeldungen kann man schwerlich helfen
-
Reine C DLLs sind kein Problem, sind beliebig austauschbar.
C++ DLLs sind Compilerabhängig (siehe Namemangeling).
Wenn du also sicher sein willst, dass eine DLL mit belibigen Compilern funktioniert, darfst du nur reine C-Funktionen exportieren. Du kannst dafür dann ja dünne C++ Wrapper als Header mitliefern.
-
Das geht "hervorragend", auch zwischen Projekten von MS VC++ und Borland BCB.
Es muss nur mit standardisierten Schnittstellen gearbeitet werden.NICHT geht, BCB- Objekte in anderen Compilern nutzen und andersrum
extern "C" sollte in beiden Richungen genutzt werden. Dann klappt das, es geht dann halt nicht alles aus c++. Innerhalb der DLLs kann ablaufen was will.
Beispiel:
Ich nutze in BCB- Projekten eine DLL (mit LIB), die von MS C++ compiliert ist
Ich vertreibe mehrere DLLs die mit BCB gemacht sind für die Nutzung in MS C++ Anwendungen (DigitalPhotoxxx.DLL für FixFoto).
Mit dem extern "C" auf beiden Seiten klappt das hervorragend.Gruss
frank
-
Oder COM/ActiveX Komponenten daraus machen! Die sind dann sogar Sprachunabhängig, also z.B. auch von VB, Delphi und verschiede C++-Compiler nutzbar. Wenns aber eh nur C ist, gibts aber als C-DLLs ja keine Probs.
-
Hallo Leute,
nachdem ihr mich alle beruhigt habt (die DLL ist in purem C), werd' ich mal eine Mini- DLL bauen und versuchen, die mit einem anderen Compiler zu nutzen.
Eine kleine Bitte noch: Wenn jemand den einen oder anderen lesenswerten Link zum Thema DLLs hat, bitte hier posten!
Danke!
-
pointercrash() schrieb:
Wenn jemand den einen oder anderen lesenswerten Link zum Thema DLLs hat, bitte hier posten!
gibt massig tutorials im internet. lässte die exportierten funktionen z.b. so aussehen:
<rückgabewert> __stdcall __declspec(dllexport) <name>(<argument_list>)
solche schnittstellen haben z.b. auch die windows system-dlls.
-
+fricky schrieb:
gibt massig tutorials im internet.
Massig ist die richtige Bezeichnung. Viel davon ist wirrköpfiges Geschreibsel
, wo man z.B. erst nach drei screens draufkommt, daß der Autor statisch und dynamisch gelinkte durcheinanderwürfelt - Zeitverschwendung
Zudem sind sie fast ausnahmslos auf eine bestimmte IDE bezogen, die ich natürlich nicht im Fundus habe.
+fricky schrieb:
lässte die exportierten funktionen z.b. so aussehen:
<rückgabewert> __stdcall __declspec(dllexport) <name>(<argument_list>)
solche schnittstellen haben z.b. auch die windows system-dlls.
Momentan wär' ich schon happy, wenn ich zwei ints rein und einen rausbekäme.
Bin jetzt am Nachvollziehen einer Anleitung für VStudio ... mal sehen ...
-
pointercrash() schrieb:
Momentan wär' ich schon happy, wenn ich zwei ints rein und einen rausbekäme.
ok, hier mal ein beispiel:
#include <windows.h> BOOL APIENTRY DllMain (HMODULE hModule, DWORD reason, LPVOID dummy) { switch (reason) { case DLL_PROCESS_ATTACH: MessageBoxA (0, "DLL_PROCESS_ATTACH", "DLL", MB_OK); break; case DLL_THREAD_ATTACH: MessageBoxA (0, "DLL_THREAD_ATTACH", "DLL", MB_OK); break; case DLL_PROCESS_DETACH: MessageBoxA (0, "DLL_PROCESS_DETACH", "DLL", MB_OK); break; case DLL_THREAD_DETACH: MessageBoxA (0, "DLL_THREAD_DETACH", "DLL", MB_OK); break; } return TRUE; } __declspec(dllexport) int __cdecl dllfunc (int a) { MessageBoxA (0, "Hello from DLL function", "DLL", MB_ICONINFORMATION); return a * 3; }
^^ das ist der code für die DLL
#include <windows.h> #include <stdio.h> void main (void) { HMODULE dll; int (__cdecl *dllfunc)(int); int ret; // dll laden dll = LoadLibraryA ("dlltest.dll"); if (dll == NULL) { puts ("dll not found"); exit(0); } // funktion finden dllfunc = (int(__cdecl *)(int))GetProcAddress (dll, "dllfunc"); if (dllfunc == 0) { puts ("dll function not found"); exit(0); } // aufrufen printf ("%d\n", dllfunc(3)); }
^^ und das zum testen (laden der dll und funktion aufrufen, ein int rein, einer raus). die messageboxen zeigen an, was von der dll gerade ausgeführt wird. wenn sich exe und dll im selben pfad befinden, dann sollte es funzen. ich bin übrigens wegen GetProcAddress auf __cdecl gegangen, mit __stdcall würde der name _dllfunc@4 heissen, was doof wäre, wenn die dll so geladen wird.
-
+fricky schrieb:
ich bin übrigens wegen GetProcAddress auf __cdecl gegangen, mit __stdcall würde der name _dllfunc@4 heissen, was doof wäre, wenn die dll so geladen wird.
Also, ich hab' durch Abpinseln, Zusammenstreichen und herumprobieren etwas, das compiliert und augenscheinlich tut. Unterscheidet sich v.a. dadurch, daß ich __stdcall genommen und ein @8 drin habe. Ganz kapiert habe ich zwar nocht nicht, was ich da genau mache, muß wohl noch ein bißchen lesen und dann mal Dein Beispiel zum Laufen bringen, für das ich mich erstmal bedanke.
Wenn ich dazu noch fragen habe, welches Forum ist das Richtige? WinAPI oder hierbleiben oder ...
-
pointercrash() schrieb:
WinAPI oder hierbleiben oder
winapi. die, die sich mit sowas auskennen, schauen hier möglicherweise garnicht rein.