Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Auf Dlls zugreifen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
24.09.2003, 21:59 Uhr
Pablo
Supertux
(Operator)


@virtual: Funktioniert das Beispiel nur unter Windows mit Cygwin gcc oder auch unter Linux?

Unter Linux bekomme ich:

Code:
/usr/i486-suse-linux/bin/ld: cannot find -ldll
collect2: ld returned 1 exit status


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
25.09.2003, 06:51 Uhr
virtual
Sexiest Bit alive
(Operator)


Funktioniert auch unter Linux. Du mußt allerdings aufpaassen, weil hier Libraries nicht *.dll sondern lib*.so heißen, daß beim Compilieren der dll muß es -olibdll.so heißen. Beim Linken jedoch nach wie vor einfach nur -ldll. Außerdem solltest Du beim Compilieren -fpic angeben, weil Shared Pobjects position indepened code sind.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
26.09.2003, 09:47 Uhr
RHBaum



@virtual
Aehm ... mit dem gcc unter Windows kenn ich mich nicht so aus, habn auch ned installiert! Der Arbeitgeber wuerde streiken :-)

Aber du bist sicher, dass das, was der gcc da raushaut, ne wirkliche Win32 DLL ist ? , mit export map etc ? So aufn ersten blick sieht es so aus, als wuerd er die dll A. irgendwie statisch behandeln, oder B. ne ganze menge notwendigen COde irgendwie, irgendwo verstecken ....
Kommt man von deinem Beispiel irgendwie an das codefragment ran, wo die LoadLibrary -Winapi Function aufgerufen wird ???
Wo versteckt er die DllMain und DllCanUnloadNow Funktionen ?
Wo gibst du die Versionsinformationen fuer die Dll an ? Gibts da auch sowas wien RessourceFile fuer ? Kannst da ueberhaupt resssourcen reinkompilieren ?

Testweise sollte man mal versuchen, von nem anderen Prog aus, deine erzeugte DLL mit Loadlibrary zu laden ... und mal schauen, was genau er ueberhaupt exportiert ....
Also ich bin echt sehr Skeptisch !!! :-)


Zitat:

Die Welt betseht aus mehr als nur der VC.


Noe, aber zumindest der Intel compiler macht haargenau das selbe wie das M$ dingens ....
Der Borland compiler auch, nur die Art wie er die dll aufrufe wrappt ist ne klein wenig anders.


Zitat:

Hat eine dll eigentlich Performancenachteile?


Gegenuber was ? :-)
Gegenuber ner Statisch gelinkten c++ Lib definitiv ...
Wie du schon sagtestm ladevorgang beim laden der DLL , und alle Aufrufe in die lib sind "far" .... sprich der compiler kann da nicht so optimieren wie bei Spruenge in statische gelinkte funktionen .... die Art Parameteruebergabe ist auch anders (stdcall), erfordert wahrscheinlich auch etwas umschiebearbeit ...

Sinn und zweck einer dll ist, von mehreren programmen verwendete funktionen nur einmal im speicher zu haben .... wenn du der einzige benutzer ner Dll bist, ist dieser Part eigentlich witzlos :-)
Und Versionsunabhaengige Implementierung. Sprich aenderst du ne Impl von ner Statischen lib, musst zumindest alle Porgramme die die nutzen, neu linken. Bei nen Dll darfst nur die exportierten funktionen ned Aendern ... und du kannst die mit allen anderen alten Programmen weiterhin nutzen ...
Wenn die Exportierten funktionen aenderst, kommt dann der Beruechtigte "Allgemeine Schutzverletzung im Modul ..." Fehler .

Ciao ...

Dieser Post wurde am 26.09.2003 um 09:48 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
26.09.2003, 10:25 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
RHBaum postete
Aber du bist sicher, dass das, was der gcc da raushaut, ne wirkliche Win32 DLL ist ? , mit export map etc ? So aufn ersten blick sieht es so aus, als wuerd er die dll A. irgendwie statisch behandeln, oder B. ne ganze menge notwendigen COde irgendwie, irgendwo verstecken ....
Kommt man von deinem Beispiel irgendwie an das codefragment ran, wo die LoadLibrary -Winapi Function aufgerufen wird ???
Wo versteckt er die DllMain und DllCanUnloadNow Funktionen ?
Wo gibst du die Versionsinformationen fuer die Dll an ? Gibts da auch sowas wien RessourceFile fuer ? Kannst da ueberhaupt resssourcen reinkompilieren ?

Testweise sollte man mal versuchen, von nem anderen Prog aus, deine erzeugte DLL mit Loadlibrary zu laden ... und mal schauen, was genau er ueberhaupt exportiert ....
Also ich bin echt sehr Skeptisch !!! :-)



Nein natürlich erzähle ich die Ganze Zeit Unsinn und es kommt was Statisches raus

Mit Resourcedateien weiß ich nicht, kann mir aber beim besten Willen keinen Hinderungsgrundvorstellen. Die DllMain, DllConUnloadNow und so weiter Funktionen mußt Du selber schreiben, sind ja nur triviale Eintrittpunkte in die DLL (die halt mit einer gewissen Semantik vordefiniert sind). Sind auch nicht zwingend erforderlich; jedenfalls habe ich hier dutzende DLLs rumfliegen, die das nicht brauchen (es mag Situationen geben, wo man das braucht, ja. Versionsinfos vermutlich dito. Aber dafür arbeite ich zuwenig unter Windows, um da eine komplett fundierte Aussage zu treffen.

Generell - ganz unabh. von der Frage DLL oder Statisch und welches Betriebssystem - ist es so, daß nirgendwo standardisiert ist, wie C++ Symbole in einer DLL, Library usw. genamemangled ( ) werden: im Gegensatz zu C, wo es eine Klare vereinbarung gibt, ist dies bei C++ generell nicht festlegt. Dh. konkret, wenn eine Library, eine Objektdatei oder eben eine DLL mit Compiler A compilierst, dann funktioniert diese nicht zwingend mit Compiler B. Nur das ist eben ein generelles Problem mit C++, weil das C++ Linkage nicht standardisiert ist. Dies ist auch der Grund, weshalb man - grade wenn die DLLs von einem Kunden benutzt werden - lieber mit C Linkage arbeitet (und daher auf den Export von Klassen verzichtet).
Insofern sind Deine Zweifel berechtigt.

Ich nehme einfach mal an, daß Intel, Borland, und VC sich da an den VC "Standard" halten und gleichen Namemangling fabrizieren. Der gcc benutzt definitiv ein anderes - Du kannst auch Unter AIX, HP, und wie die ganzen UNIXe alle heißen, keine g++ libraries/objekte gegen dinge Linken, die mit dem jeweiligen nativen C++ Compiler gebaut werden

Allerdings hat das wieder nichts mit ImportLibraries zu tun, weil diese ImportLibraries dich nicht von diesem Übel befreien: Da stehen die Namen genauso genamemangled drin, wie in der DLL.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
26.09.2003, 10:48 Uhr
RHBaum



Ok, hab noch mal tiefer in den Abgruenden der MSDN geschaut ...

Microsofts definition:

Normale Dll - hat nur C-Schnittstelle

Erweiterungs-Dll - kann Klassen exportieren .... und sind Achtung!!! VC und Versions-Spezifisch !!!
Die Lib drumherum erzeugt dir eh nur der Codemanager, oder wie das Teil heisst ... wenn du ne Mfc-ErweiterungsDll baust.

DIe Grauzone / und das wo wir uns drueber "streiten" ist da ned definiert.
Aber, tief in der Dokumentation finden sich auch hinweise.
Auch unter VC kann man klassen exportieren, ohne MFC_ErweiterungsDll Stub. (also ohne Lib).
Das Dll Project und die Anwendung muss gewisse Compilerflags gestetzt haben.
Es duerfen nur einfache klassen exportiert werden, also ohne polymorphie,
statische member funktionieren, aber bestimmt ned wie erwartet :-) und ein direkter zugriff auf members ist nicht moeglich.
Dafuer braucht man aber dann auch keine Lib ....

Also hasst recht, es geht prinzipiell ... Asche auf mein haupt!
nur eben mit vorsicht zu geniesen. Einige Patchs innerhalb von Vc sollen auch probleme damit verursachen !
Wir koennen uns ja nun weiter ueber den Sinn solcher Dlls streiten ! :-)

Was er bei der MFC geschichte tut, keine Ahnung, aber ich glaub von den Klassen kann man Ableiten, und man kann die members direkt ansprechen ... also wird er sicher doch ne menge wrappen ...

Ciao ....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
26.09.2003, 12:20 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
RHBaum postete
Wir koennen uns ja nun weiter ueber den Sinn solcher Dlls streiten ! :-)



Können oder müssen?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
26.09.2003, 12:47 Uhr
RHBaum




Zitat:

Können oder müssen?


Dürfen ? :-)

Naja, waer sicher genau so fruchtbar als wie wenn sich nen Umweltschuetzer und nen Tankstellenwart ueber denn Sinn von 5 Liter Hubraum PKW motoren unterhalten :-)

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
26.09.2003, 14:16 Uhr
~(un)wissender
Gast


wer ist der Tankstellenwart?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
27.09.2003, 16:00 Uhr
~DerLiebeGast
Gast


Das einzige Problem mit der Klassengeschichte ist die interne Namenserweiterung von VC++(ne Anwendung die mit nem anderen Compiler erstellt wurde frisst die nicht).
MFC-Erweiterungs Dll´s können ohnehin nur von MFC-Anwendungen genutzt werden!

MfG
DerLiebeGast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
27.09.2003, 17:28 Uhr
Pablo
Supertux
(Operator)



Zitat:
virtual postete
Funktioniert auch unter Linux. Du mußt allerdings aufpaassen, weil hier Libraries nicht *.dll sondern lib*.so heißen, daß beim Compilieren der dll muß es -olibdll.so heißen. Beim Linken jedoch nach wie vor einfach nur -ldll. Außerdem solltest Du beim Compilieren -fpic angeben, weil Shared Pobjects position indepened code sind.


Irgendwie hat etwas nicht funktioniert.

Ich hab so kompiliert:

Code:
g++ -o libdll.so dll.cpp -share
g++ -o test mydll.cpp -fpic -ldll -L.


Und ich bekomme

Code:
./test: error while loading shared libraries: libdll.so: cannot open shared object file: No such file or directory


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: