Forum: PC-Programmierung C++ Virtual Function Table Probleme?


von Josef (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Problem mit der VTable, befürchte ich.
Ich arbeite hier auf einem Windows CE 6.0 und Programmiere mit dem 
Visual Studio 2008.

Ich habe eine Lib und DLL die laut Ersteller folgendes exportiert:
1
class __declspec(dllexport) LibClass
2
{
3
    public:
4
        LibClass();
5
        virtual ~LibClass();
6
  virtual void func1() = 0; 
7
  virtual void func2() = 0;      
8
  virtual LibClass* func3() = 0;
9
};

In einer anderen Klasse gibt es die Funktion
1
class __declspec(dllexport) SecondClass{
2
    public: 
3
      static SecondClass* create(LibClass* pLibClas);

Bei mir in meinem Projekt (der Exe) habe ich die .lib eingebunden und 
den Header und leite dort von der "LibClass" Klasse ab, fülle die 
Funktionen mit Inhalt und übergebe dann der create Funktion der 
SecondClass meinen Pointer.

Das ganze sieht so aus:
1
class CMyClass : public LibClass 
2
{
3
public:
4
  CMyClass  (void);
5
  virtual ~CMyClass (void);
6
  virtual void func1();
7
  virtual void func2();
8
  virtual LibClass* func3();
9
private:
10
  HANDLE m_hMutex;
11
};

Dann mache ich eben noch in der Mainloop:
1
CMyClass* pmyClass = NULL;
2
SecondClass* pSecondClass = NULL;
3
...
4
pmyClass = new CMyClass();
5
pSecondClass  = create(pmyClass);

Und nun kommt das kuriose. Der Ersteller der Lib bekommt durch die 
create Funktion den Pointer auf pmyClass und ruft bei sich 
pmyClass->func1(); und pmyClass->func2(); auf aber es wird bei mir func2 
und func3 ausgeführt.
Wieso ist das so?! Kann mir das jemand erklären?

Besten Dank und Gruß
Josef

von Karl H. (kbuchegg)


Lesenswert?

Josef schrieb:

> create Funktion den Pointer auf pmyClass und ruft bei sich
> pmyClass->func1(); und pmyClass->func2(); auf aber es wird bei mir func2
> und func3 ausgeführt.

Ist das jetzt ein Tippfehler, oder ist das die Beschreibung des 
Fehlverhaltens?

D.h. ein Aufruf von func1() führt dazu, dass func2() aufgerufen wird?


Das könnte ich mir eigentlich nur so erklären, dass die Export-Library 
nicht mit der IMplementierung in der DLL übereinstimmt.
Oder der Ersteller hat dich angelogen und er ruft in Wirklichkeit nicht 
func1() auf, sondern tatsächlich func2()
Mischmasch in den Compilereinstellungen könnte ich mir auch noch 
vorstellen - 16 Bit Exe versus 32 Bit Exe versus 64 Bit Exe - ein 
Unterschied ist zb, dass Pointer dann unterschiedlich lang sind. Obwohl: 
das wäre dann schon ein enormer Zufall, dass das nicht mit Bausch und 
Bogen einfach abschmiert und ob man das dann so durch den Linker bzw. 
den DLL-Lademechanismus kriegt ... nie wirklich ausprobiert, aber ich 
denke da sind Sicherungen drinnen.

Source Code mässig hast du dir jedenfalls nichts vorzuwerfen. Genau so 
sollte das funktionieren. Das Problem liegt irgendwo im Umfeld.

: Bearbeitet durch User
von Josef (Gast)


Lesenswert?

Einen Tippfehler schließe ich aus. Die Funktionen heißen im Programm 
auch nicht nur func1 und func2 sondern ganz anders und wenn ich in dem 
Headerfile von der Lib die Anordnung der Funktionen ändere, dann ruft er 
auch die neue Reihenfolge auf.

Also  wenn der Header, den ich in meiner Exe einbinde, so aussieht:
1
class __declspec(dllexport) LibClass
2
{
3
    public:
4
  LibClass();
5
  virtual ~LibClass();
6
  virtual LibClass* func3() = 0;  
7
  virtual void func1() = 0; 
8
  virtual void func2() = 0;      
9
};

Dann wird auch func3 und func1 aufgerufen. Ohne dass er die Lib neu 
gebildet hat und bei sich dann immer noch func1 und func2 aufruft.
Also es scheint so als wenn meine VTable so aussieht:
ctor
dtor
func3
func1
func2

und seine sieht
ctor
dtor
func1
func2
func3
aus.

Wenn ich dann den von ihm gelieferten Header manuell anpasse, dass er so 
aussieht wie seine Functiontable, dann ruft er anscheinend die richtigen 
Funktionen auf.

von Peter II (Gast)


Lesenswert?

Josef schrieb:
> Wenn ich dann den von ihm gelieferten Header manuell anpasse, dass er so
> aussieht wie seine Functiontable, dann ruft er anscheinend die richtigen
> Funktionen auf.

denn passt eventuell der Header schon nicht zur lib

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> Josef schrieb:
>> Wenn ich dann den von ihm gelieferten Header manuell anpasse, dass er so
>> aussieht wie seine Functiontable, dann ruft er anscheinend die richtigen
>> Funktionen auf.
>
> denn passt eventuell der Header schon nicht zur lib

Darauf würde ich jetzt auch mal tippen, dass der Ersteller im Header 
File noch mal nachgebessert hat und dabei unwissentlich die Reihenfolge 
verändert hat.

Es gibt doch eine Möglichkeit, wie man eventuell aus der DLL selber die 
INformationen noch mal rausziehen kann.
http://msdn.microsoft.com/en-us/library/8etzzkb6.aspx
Schon mal probiert, ob da was rauskommt?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.