DLL-Frage
-
hi,
ich hatte ein Problem mit einem Warning von VC 5.0, da ich meine ganze Klasse aus einer DLL exportieren wollte.
Ich habe jetzt einfach meine Member-Methoden alle exportiert. Das sieht dann so aus:
Code:class CDevice { private: LPDIRECT3D9 lpd3d; IDirect3DDevice9 *lpd3ddevice; D3DXMATRIX proj2d,view2d; public: CDevice(void); DLLPORT void Init(HWND MainHwnd,int SreenWidth,int ScreenHeight,bool vsync); DLLPORT void Destroy(void); DLLPORT void ClearScreen(DWORD color); };
Diese(oben) Header-Datei binde ich in meine DLL ein. DLLPORT ist ein Makro für Export (dieses __declspec(dllexport)
#define DLLPORT __declspec(dllimport) class CDevice { public: DLLPORT void Init(HWND MainHwnd,int SreenWidth,int ScreenHeight,bool vsync); DLLPORT void Destroy(void); DLLPORT void ClearScreen(DWORD color); };
So, diese Header-Datei binde ich in mein richtige exe ein. Es scheint auch zu funktionieren. Ist das ok so, wie ich das mache?? Kann da irgendwas schief gehen?
-
Hallo,
Standard-C++ kennt keine DLLs.
Verschoben nach MFC mit dem VC.
-
Ich weiß hier nicht ob du dann eine Klasseninstanz erzeugen kannst da die Klasse ja nicht exportiert wurde.
Wenn du schon alle Funktionen exportieren willst warum nicht gleich die Klasse[ Dieser Beitrag wurde am 07.03.2003 um 15:58 Uhr von Unix-Tom editiert. ]
-
hatte ich ja schon erwähnt:
Wegen diesem Warning hier:CEngine.cpp D:\Programmierung\FlatEngine\CEngine.h(17) : warning C4251: 'm_ApplicationName' : class 'std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CEngine' verwend et wird D:\Programmierung\FlatEngine\CDevice.h(20) : warning C4251: 'proj2d' : struct 'D3DXMATRIX' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CDevice' verwendet wird D:\Programmierung\FlatEngine\CDevice.h(20) : warning C4251: 'view2d' : struct 'D3DXMATRIX' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CDevice' verwendet wird D:\Programmierung\FlatEngine\CTextures.h(33) : warning C4251: 'TexVector' : class 'std::vector<struct Texture_s,class std::allocator<struct Texture_s> >' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CTextures' verwendet wird D:\Programmierung\FlatEngine\CTextures.h(34) : warning C4251: 'ShaderVector' : class 'std::vector<struct Shader_s,class std::allocator<struct Shader_s> >' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CTextures' verwendet wird Linker-Vorgang läuft...
-
Ich habe mal folgendes in meiner exe probiert:
__declspec(dllimport) CEngine OEngine; __declspec(dllimport) CInput OInput; CEngine OEngine2;
Funktioniert beides.
-
Mit dieser DLL-Schnittstelle kannst Du zwar auf Funktionen des CDevice-Objekts zugreifen, jedoch ausserhalb der DLL kein Objekt vom Typ CDevice anlegen, da dafür dem Compiler die Grösse des Objekts bekannt sein muss, welche Du ja nicht rausgeben darfst.
Folgendes Workaround:
// Header class DLLPORT IDevice { public: virtual void Init(HWND MainHwnd,int SreenWidth,int ScreenHeight,bool vsync)=0; virtual void Destroy(void)=0; virtual void ClearScreen(DWORD color)=0; }; IDevice* DLLPORT CreateDeviceAndInit( HWND MainHwnd,int ScreenWidth,int ScreenHeight, bool vsync); // in DLL (*.cpp) class CDevice : public IDevice { // ... }; CDevice::Destroy() { delete this; } CDevice* CreateDeviceAndInit(HWND MainHwnd,int SreenWidth,int ScreenHeight,bool vsync) { CDevice* pDevice = new CDevice; pDevice->Init( MainHwnd, ScreenWidth, ScreenHeight, vsync); return pDevice; }
[ Dieser Beitrag wurde am 07.03.2003 um 16:21 Uhr von RenéG editiert. ]