Klassen in DLL



  • Hallo,

    nachdem ich jetzt die komplette FAQ durchgenudelt hab, funzt es immernoch nicht.

    Ich habe eine DLL geschrieben mit Funktionen und Klassen. Die Funktionen, die ich exportieren will, funktionieren, nur die Klassen, die auch exportiert werden sollen erkennt die aufrufende Anwendung nicht.

    Funktion in DLL: __declspec(dllexport) int Hallo()
    {...}
    Funktionsprototyp in Anwendung: __declspec(dllimport) int Hallo();
    Aufruf funktioniert.

    Nur steht jetzt überall, daß man Klassen in DLLs nicht definieren kann, obwohl ein Beispiel angegeben ist, was aber net funzt.

    Falls es keine Lösung gibt, wie soll man es sonst machen ? Ich habe auch Vererbung drinnen und virtuelle Methoden, das läßt sich schlecht auf globale Funktionen "runterflatten".

    ?????

    Danke für Hilfe !!!



  • Na klar kann man Klassen in einer DLL deklarieren:

    Zunächstmal solltest due folgendes definieren (im DLL-Header):

    #ifdef USE_DLL
    #define DLL_API __declspec(dllimport)
    #else
    #define DLL_API __declspec(dllexport)
    #endif

    das mach die Sache einfacher und du schreibst nur noch DLL_API vor deine Funktionen. Dann brauchst due nur ein Header verwenden.

    In der Datei, wo du den Header deiner dll includest schreibst vor der entspechenden #include-Derektive:

    #define USE_DLL

    So, um eine Klasse in eine DLL zu exportieren schreibst du das ganze wie folgt:

    class DLL_API CDeineKlasse
    {
    //...
    };

    So sollte es funktionieren.



  • Genau so habe ich es gemacht,

    so funktioniert es aber nicht.

    Undefined structure ...

    Was mache ich falsch, oder an was kann es liegen ?



  • Außer Strukturen und Klassen funktioniert alles.

    Oder liegt es an einer Compilereinstellung ? Welche ?



  • Bei Strukturen brauchst du nichts zusätzlich definieren. Die stehen ja im Header, oder? Und den Header bindest du ja ein.

    Was für Fehler hast du denn?



  • eine Klasse zu exportieren bzw. importieren geht ganz einfach. Ein kleines Beispiel (Client und DLL)

    //Demo001.cpp - die DLL
    
    #include <windows.h>
    #include "demo001.h"
    
    int Demo001::Test(HWND hWnd)
    {
    	return ::MessageBox(hWnd,"Klassen-Aufruf","Demo001",MB_ICONASTERISK);
    }
    
    //Demo001.h
    #pragma once
    
    #ifdef DLL_IMPORT
    #define DLL_CLASS __declspec(dllimport)
    #else
    #define DLL_CLASS __declspec(dllexport)
    #endif
    
    class DLL_CLASS Demo001
    {
    	int a, b, c;
    public:
    	int Test(HWND hWnd);
    };
    
    //Demo001Client.cpp - Client Anwendung
    
    #include <windows.h>
    #include "resource.h"
    #define DLL_IMPORT
    #include "demo001.h"
    
    #pragma comment(lib,"demo001")
    
    INT_PTR CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg) {
    		case WM_COMMAND:
    			if (LOWORD(wParam) == IDC_BUTTON1) {
    				Demo001 Demo;
    				Demo.Test(hWnd);
    			}
    			if (LOWORD(wParam) == IDOK)
    				::SendMessage(hWnd,WM_CLOSE,0,0);
    			break;
    		case WM_CLOSE:
    			::EndDialog(hWnd,0);
    			break;
    		default:
                return 0;
    	}
    	return 1;
    }
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
    {
    	return static_cast<int>(::DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),0,WndProc));
    }
    

    Falls jemand Interesse hat, kann ich das ganze Demo Projekt online stellen. 🙄 😉



  • es klappt nicht,
    außerdem ist das Beipiel nichts anderes wie oben !!!



  • dann machst du etwas falsch, denn mein Beispiel funktioniert



  • IoI, habs gefunden.

    Trotzdem danke....


Anmelden zum Antworten