Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Dll

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
20.01.2004, 21:22 Uhr
virtual
Sexiest Bit alive
(Operator)


Guck Dir die Datei im Dependency Walker an. (depends.exe)
--
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
011
20.01.2004, 23:15 Uhr
(un)wissender
Niveauwart


@Windalf
Das Problem mit C++-dlls ist z.B. das Name-mangeling, was nicht standardisiert ist, also kann eine mit dem gcc erstellt C++-dll nicht vom Vc++ genutzt werden, mit C geht das.

@virtual
Wow, das sieht ja einfach auch, danke.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
21.01.2004, 09:12 Uhr
~Dirk23
Gast


@virtual:

Der Dependency Walker gefällt mir eigentlich schon recht gut. Ich habe jetzt mal eine DLL damit geöffnet. Am Anfang kommen ganz komische Funktionsnamen, wie z.B. ??0!Sample@@QAE@ABV0@@Z. Ab Nummer 9 kommen dann richtige Funktionsnamen in dieser DLL mit denen man etwas anfangen kann.
Bei einer anderen DLL, die ich geöffnet habe, kommen nur so komische Funktionsname wie der oben genannte.
Woran liegt das? Was kann ich mit diesen komischen Funktionsnamen anfangen?

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
21.01.2004, 09:39 Uhr
virtual
Sexiest Bit alive
(Operator)


Du musst unterscheiden zwischen C und C++ Linkage.

Erstmal das einfache:
In C gibt es immer nur einfache Funktionen. Diese Funktionen sind durch ihren Namen eindeutig bestimmt. Wenn ich eine Funktion

C++:
void function(char*) { ... }


habe, dann ist der Name function eindeutig; insbesondere kann es in C nicht eine weitere Funktion mit gleichen Namen und anderen parametern geben. In C++ schon: Da ist der Funktionsname nicht eindeutig, sondern nur die Kombination Funktion+Typen der Parameterliste.
Langer Rede, kurzer Sinn: In C genügt der Name einer Funktion und dieser name wird bei C Linkage auch einfach in der DLL vermerkt, und zwar so wie er ist.

In C++ sieht es deutlich komlizierter aus:
Zum einen Kann man funktionen überladen:

C++:
void function(char*) { ... }
void function(int) { ... }


Beide Funktionen mögen zwar gleich heissen, haben aber unterschiedliche Parameter (einmal char*, zum anderen int). Dh wenn man mit C++ Linkage arbeitet, reicht es nicht aus, allein den Namen der Funktion in der DLL zu kodieren, sondern man muß auch die Parametertypen irgendwie an den namen dranhängen. hinzu kommen eben noch klassen, dann muß in den Methodennamen noch vermerkt werden, zu welcher Klasse sie gehören.
Dies führt zu diesen kryptischen Namen wie "??0!Sample@@QAE@ABV0@@Z.". Die Funktion/Methode wird wohl irgendwas mit der Klasse "Sample" zu tun haben, vermutlich ein Constructor, weil man keinen expliziten Methodennamen sieht. Die komichen Zeichen dienen dazu, die Parametertypen zu spezifizieren.
Alles in Allem nennt man diese Namensbildung "Namemangling", also das Vermatschen von den funktionsnamen in irgendwas, was eben auch die Parameter beschreibt.
Das kernproblem:
1. namemangling ist nicht Standardisiert, dh. unterschiedliche Linker produzieren unterschiedliche Namen was dazu führt, das DLLs nicht untereinander kompatibel sein können.
2. Unter Windows ist mir kein tool bekannt, welches einen gemanglten Namen in Klartext umwandeln könnte; unter UNIX schon (nm heißt es dort).

Bei Klassen wirst Du nicht darum kommen, DLLs mit gemanglten Namen zu haben; bei Normalen funktionen, solange du sie nicht überlädst (also gleiche Funktionsnamen mit unterschiedlichen parametern verwendest) kannst Du Namemangling verhindern, indem du mit extern "C" C-Linkage erzwingst.
--
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
21.01.2004, 10:38 Uhr
~Dirk23
Gast


Vielen Dank für deine Antwort. Da konnte ich wirklich alles verstehen. Du solltest Buchautor werden, falls du nicht schon einer bist. Jetzt sehe ich das Problem mit diesem C++-Linkage und dem Namenmangling.
Da wird wohl in der DLL, die ich geöffnet habe teilweise C-Linkage und teilweise C++-Linkage verwendet worden sein.
Nun noch eine Frage zu meiner Dll und diesem C++-Linkage.
Wenn ich weiss, wie die Klassen heissen, die von der dll mittels c++-linkage exportiert worden sind, kann ich dann ganz einfach in der Anwendung ein Objekt dieser Klasse anlegen und auf alle plublic deklarierten Funktionen dieser Klasse zugreifen?

Wie sieht es aus mit Interfaceklassen? Denn in der dll, die ich vor mir habe, gibt es eine rein virtuelle Klasse, von der dann eine Klasse abgeleitet wurde. Und beide Klassen, so scheint es mir zumindest werden exportiert.
Ach, das ist alles so verwirrend. Hoffentlich kannst du Licht ins Dunkel bringen.

Vielen Dank schon mal im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
21.01.2004, 10:53 Uhr
virtual
Sexiest Bit alive
(Operator)


Zu dem, was ich gesagt habe, gibt es zwei ausnahmen:
1. inline funkionen/methoden:
Diese Methoden können in der DLL auftauchen, müssen aber nicht.
2. pure virtual Methoden:
Diese Methoden können in der DLL auftauchen, müssen aber nicht.

Bei pure virtual methoden, also sowas

C++:
class Klasse
{
public:
     virtual int pure_virtual() = 0;
};


Liegt ja erstmal keine funktion vor. Denkbar ist hier, daß ein Linker eine Pseudo Routine in die DLL reintut, die nichts anderes macht, als eine Exception zu werfen. Ist aber implementationsabh., wie alles was wir hier besprechen.
--
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
21.01.2004, 10:57 Uhr
(un)wissender
Niveauwart


@virtual
Wie kann eine Inline-Funktiuon in der dll sein?
Die muss doch im Header sein.
Darum kann man in einer dll auch sicher nicht templates benutzen, oder?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
21.01.2004, 11:11 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein: Templates in DLL gehen wirklich nicht, weil erst zur Compilezeit (und damit zum zeitpunkt der Verwendung des zur DLL gehörenden Headers) die Impelemtierung des Templates feststeht.

Was inline angeht, so nehmen wir mal folgende inline Funktion:

C++:
inline void ich_bin_inline()
{
     std::cout<<"ich bin zwei Öltanks"<<std::endl;
}


Diese Funktion muß ja zwingend in einem Header stehen. Nehmen wir mal an, der Compiler nimmt das inline ernst (muß er ja nicht) und produziert wirklich inline, wo er nur kann:
Dann wird jeder normale Funktionsaufruf sicherlich "geinlinet". Aber was passiert mit solchen Dingen:

C++:
void* ptr = &ich_bin_inline;


ptr soll die Adresse der funktion sein. In diesem Fall hat der Compiler eigentlich kaum eine Wahl: er muß eine nicht inline Versionder funktion bereitstellen. Da eine DLL niemals wissen kann, wie ihre Funktionen verwendet werden, wird die DLL vermutlich einen entsprechenden Eintrittspunkt (und damit Adresse) bereitsstellen. Die alternative wäre nämlich, daß sonst die Funktion in einer komplexeren Anwendung mehrere Adressen besitzen könnte. Von daher wird man wohl zur Vereinfachung bei DLLs das inline schlicht ignorieren und einen richtiger funktion draus machen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 21.01.2004 um 11:12 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
21.01.2004, 13:23 Uhr
(un)wissender
Niveauwart


Ok, aber das lässt dann ja doch das Fazit zu, das inline und dll einfach nicht zusammen passen, oder?
Außerdem, wie soll das sonst funktioieren, selbst wenn die dll sicher sein kann, das niemals die Adresse der Funktion benötigt wird?
Inline bedeutet die Ersetzung zur Compilezeit, das geht also mit der dll schon mal nicht, da müßte ja die exe beim laden verändert werden, oder zumindest ihrer Repräsentation im Speicher.
Ich behauptet jetzt mal, das inline ebenso wie templete mit dlls vom Prinzip her gar nicht funktionieren kann, möglich wäre sowas mit der java virtual maschine, aber doch nicht mit statischem Code.
Sehe ich das völlig verkehrt?
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 21.01.2004 um 13:24 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
21.01.2004, 13:47 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich sehe das wie gesagt so:
Template Code: Wandert niemals in eine DLL rein
Inline Code: Das "inline" wird ignoriert und die Funktion in die DLL geschrieben.
--
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
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


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: