class inheritance within dll (c++)

Started by
5 comments, last by iliak 18 years, 9 months ago
Hi I'm building a dll and I export class to the final user

file iTexture.h (for the final user)
class iTexture
{
	virtual	bool	IsTextureValid(void) = 0;
};


file cTexture.h (internal to the dll)
class cTexture : public iTexture
{
	bool	IsTextureValid(void);
};


file iStreamTexture.h (for the final user)
#include "iTexture.h"
class iStreamTexture : public iTexture
{
	virtual	bool	LoadAVIStream(const char *filename) = 0;
};


file cStreamTexture.h (internal to the dll)
#include "cTexture.h"
class cStreamTexture : public cTexture
{
	bool	LoadAVIStream(const char *filename);
};


My new created functions in cStreamTexture are all invalid (0x00000000 in vtable). Does someone have an idea ?
- Iliak -
[ ArcEngine: An open source .Net gaming framework ]
[ Dungeon Eye: An open source remake of Eye of the Beholder II ]
Advertisement
Quote:Original post by iliak
Hi

I'm building a dll and I export class to the final user

*** Source Snippet Removed ***

My new created functions in cStreamTexture are all invalid (0x00000000 in vtable). Does someone have an idea ?

You need to declare the linkage type for the classes that reside in the dll....


when compiling the dll each class that is exported must have:

__declspec(dllexport)

and while compiling the user application it should be:

__declspec(dllimport)

As in:

__declspec(dllexport) class someclass {    .....};
It only breaks when I try to call any new function in iStreamTexture. An example :




//Create a cStreamTexture in my dll and give back a iStreamTextureiStreamTexture *stream = (iStreamTexture *)Texture->CreateTexture(256, 256, false, PF_RGB, Video);if (stream){	stream->GetHeight();                       <= Good	stream->LoadAVIStream("data/face2.avi");   <= Fail}
- Iliak -
[ ArcEngine: An open source .Net gaming framework ]
[ Dungeon Eye: An open source remake of Eye of the Beholder II ]
Your vtables do not match up. iStreamTexture is-a iTexture and has two virtual functions: bool IsTextureValid() and bool LoadAVIStream(const char *). cStreamTexture on the other hand is-a cTexture (and therefore also is-a iTexture. It therefore has only one virtual function: bool IsTextureValid(), inherited from iTexture.

What you need to do is this:
// iTexture.hclass iTexture{	public:		virtual	bool isTextureValid() = 0;};// cTexture.hclass cTexture	:	public virtual iTexture{	public:		virtual bool isTextureValid(void);};// iStreamTexture.hclass iStreamTexture	:	public virtual iTexture{	public:		virtual	bool loadAviStream(char const * filename) = 0;};// cStreamTexture.hclass cStreamTexture	:	public virtual cTexture,	public virtual iStreamTexture{	public:		virtual bool loadAviStream(char const * filename);};

Now cStreamTexture is-a iStreamTexture and the vtables match up. As an added bonus the vtables will always match up even if you use different compilers for the source and dll, provided both compilers are COM-compliant. To use it you also need to swap your unsafe C-style cast for a C++ dynamic_cast:
iStreamTexture * stream = dynamic_cast< iStreamTexture * >(Texture->CreateTexture(256, 256, false, PF_RGB, Video));if (stream){	stream->getHeight();	stream->loadAviStream("data/face2.avi");}

Enigma
Nice shot Cap'tain ! Now the project compile right, but I have a a C4250 warning for each function as below :

Compilation...cStreamTexture.cppd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::GetType' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(267) : voir la déclaration de 'bradock::cTexture::GetType'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::Save' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(271) : voir la déclaration de 'bradock::cTexture::Save'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::IsTextureValid' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(283) : voir la déclaration de 'bradock::cTexture::IsTextureValid'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::SetWrapClamp' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(275) : voir la déclaration de 'bradock::cTexture::SetWrapClamp'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::SetWrapRepeat' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(276) : voir la déclaration de 'bradock::cTexture::SetWrapRepeat'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::GetHeight' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(281) : voir la déclaration de 'bradock::cTexture::GetHeight'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::GetWidth' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(282) : voir la déclaration de 'bradock::cTexture::GetWidth'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::GetPixelFormat' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(280) : voir la déclaration de 'bradock::cTexture::GetPixelFormat'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::Lock' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(294) : voir la déclaration de 'bradock::cTexture::Lock'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::Unlock' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(295) : voir la déclaration de 'bradock::cTexture::Unlock'd:\Dev\BradockEngine\Bradock\src\cStreamTexture.h(40) : warning C4250: 'bradock::cStreamTexture' : hérite de 'bradock::cTexture::bradock::cTexture::AutoMipMapGenerate' via la dominance        d:\Dev\BradockEngine\Bradock\src\cTexture.h(288) : voir la déclaration de 'bradock::cTexture::AutoMipMapGenerate'Édition des liens en cours...

- Iliak -
[ ArcEngine: An open source .Net gaming framework ]
[ Dungeon Eye: An open source remake of Eye of the Beholder II ]
That warning is informational only and can be safely ignored (or better yet, disabled with #pragma warning(disable: 4250)).

Enigma
Yes, it's what I saw.
Many thanks !!
- Iliak -
[ ArcEngine: An open source .Net gaming framework ]
[ Dungeon Eye: An open source remake of Eye of the Beholder II ]

This topic is closed to new replies.

Advertisement