008
24.09.2003, 14:57 Uhr
virtual
Sexiest Bit alive (Operator)
|
Zitat: |
RHBaum postete Hab ich jetzt nen Blackout ?
|
Offenbar,
Zitat: |
RHBaum postete Noe, dem Linker und dem Compiler musst schon sagen, Ich kompilier jetzt eine DLL ... dann legt er die Export map an ... die DLL hat etwas mehr Inhalt als ne Lib. Die lib(Statisch) benutzt Symbole, wo deine Funktionen drauf verweisen ... und die lib ist ja mit deinem Binary gelinkt, also soweiso immer geladen ....
|
Zum dritten mal: Die Welt betseht aus mehr als nur der VC. Es gibt Compiler/Linker, die benötigen unter Windows importLibs. ja. Der VC gehört dazu. Auch ja. Aber: es gibt compiler, die ohne auskommen, ohne den Ganzen quatsch. Ein Beispiel zum Mitmachen? - Okay (sehr vereinfacht, aber funtionierend, wenn man den cygwin Port des gcc hat):
C++: |
/* dll.h */ class A { public: A(); };
|
C++: |
/* dll.cpp */ #include "dll.h" #include<iostream>
A::A() { std::cout<<"A::A"<<std::endl; }
|
Das ganze so zusammenbauen:
Code: |
g++ -odll.dll -shared dll.cpp
|
Kommt ne DLL raus, ohne ImportLibrary. Der Dependency Wolker wird dir bestätigen, daß der ctor exportiert wurde. Nun testen obs klappt:
C++: |
/*testprg.cpp */ #include "dll.h"
int main() { A a; }
|
Und zusammenlinken:
Code: |
g++ -ldll -L. -otestprg testprg.cpp
|
Fertig. Im Dependency walker siehst du, daß testprg aus dll.dll seinen ctor holt.
Zitat: |
RHBaum postete Ne DLL ist meist nicht geladen, das ist ja auch der SInn. ALso musst du die DLL erst mal laden, oder wenn jemand anders die Schon angezogen hat, dir die Startadresse (wird vom BS festgelegt, gibt nen richtwert, denn bei der Erstellung der DLL angibst, ist aber nicht sichergestellt, das die dann dort auch eingeblendet ist) holen. Die Exportmap startet auch an ner ganz bestimmten stelle ... und du musst dir mit getProcAdress uber den namen oder der ID erst mal die Startadresse deiner Funktion holen .... weil die sich ja geaendert haben kann (dll neu kompiliert, programm nicht, abwaertskompatiblitaet. ) also kann das Programm keine Festen Symbole verwenden, wie bei der Festverlinkten Lib. deshalb musst auch die verenkungen machen, um ne Dll geladen zu bekommen.
|
Quatsch. Wie gesehen, Du musst Verrenkungen machen, weil du den VC benutzt.
Zitat: |
RHBaum postete Und ich behaupte immer noch, eine Klasse bekommst nicht ueber ne DLL Schnittstelle Rueber. ...
|
Ich fände es gut, wenn du diese Behauptung untermauern könntest. Bereits im Post zuvor habe ich dir sogar schon ein Beispiel genannt, wie man es mit dem VC schafft (nämlich über ImportLib, was beim VC immer gebraucht wird). -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |