MFC-DLL für intelligente Geräte

Freak_Desperado

Erfahrenes Mitglied
Moin moin!
Ich brauche für mein Programm (in C# geschrieben) einige Funktionen, die wohl nur in C++ zu implementieren sind, da das .NET Compact Framework diese nicht unterstützt.

Also möchte ich diese Funktionen in einer DLL-Datei unterbringen und diese dann in C# laden.

Ich habe es erstmal mit einem Testprojekt versucht, um mal zu schaun, wie das mit den DLL-Dateien überhaupt funktioniert.

Ich habe jetzt folgendes:
Code:
testapp.h (aufs Wesentliche gekürzt):

class TestApp : public CWinApp{ // ": public CWinApp hat VisualStudio hinzugefügt
    private:
        int a;
        int b;

    public:
        TestApp();
        __declspec(dllexport) int testfunktion(int x, int y);

    // Überschreibungen
    public:
        virtual BOOL InitInstance();

        DECLARE_MESSAGE_MAP();
}

Code:
testapp.cpp (aufs Wesentliche gekürzt):

TestApp::TestApp(){
    a = 0;
    b = 0;
}

__declspec(dllexport) int TestApp::testfunktion(int x, int y){
    return x + x * y;
}

// Das einzige TestApp-Objekt
TestApp theApp;


// TestApp-Initialisierung
BOOL TestApp::InitInstance(){
    CWinApp::InitInstance();

    return TRUE
}


Nun wird der Einsprungspunkt nicht gefunden.
Die def-Datei habe ich gar nicht berührt, da ich nicht weiß, wie diese aufgebaut sein muss.
Wozu ist die Funktion InitInstance und warum wird das Objekt theApp erzeugt?


Was mache ich falsch?



Gruß
Michael
 
Zuletzt bearbeitet:
Hallo,

Klassenmethoden können nicht exportiert werden, da die Aufrufkonvention nicht stimmt. Außerdem müsstest du die Klasse vorher noch instanziieren.
Du kannst eine Wrapperfunktion verwenden, die mit extern "C" deklariert wird:
C++:
extern "C" _declspec(dllexport) int testfunktion(int x, int y)
{
    TestApp testApp;
    return testApp.testfunktion(x, y);
}
Gruß
MCoder
 
Ah! Danke.
Das werde ich nach Feierabend gleich mal ausprobieren.

[Edit]
Nun bekomme ich die Fehlermeldung, dass der Einstiegspunkt für die Funktion testfunktion der Klasse TestApp nicht gefunden werden kann. :(

Muss die Funktion zusätzlich auch noch irgendwie bekannt gemacht werden?
[/Edit]

Gruß
Michael
 
Zuletzt bearbeitet:
Ja, du solltest die Funktion deklarieren. Das kannst du der Einfachheit halber am Anfang der cpp-Datei machen, welche die Funktion implementiert.


Gruß
MCoder
 
Ich habe den Funktionsprototypen in die Headerdatei gepackt.
Auch mit extern "C" _declspec(dllexport).

Oder muss das nur bei einem von beiden vor?


Gruß
Michael
 
Hallo Michael,

da lag ich falsch; die extern "C" - Funktionen müssen nicht unbedingt deklariert werden. Die Fehlermeldung hat also noch eine andere Ursache und scheint bei der TestApp-Klasse zu liegen. Hast du eigentlich das "__declspec(dllexport) " vor der Klassenmethode wieder entfernt?

Gruß
MCoder
 
Entfernt habe ich das noch nicht.
Ich habe jetzt auch mal einen anderen Ansatz (ohne Klasse) versucht, da ich momentan nur eine einzige Funktion benötige.

Ich habe also fast alles, das mir das Visual Studio generiert hat, entfernt und nur die eine Funktion gelassen. Dieser habe ich extern "C" _declspec(dllexport) vorangestellt.


Gruß
Michael
 
Funktioniert das jetzt besser?
Für Standard-DLLs sollte man ohnehin auf die MFC verzichten und nur ein Win32-Projekt als DLL erstellen.

Gruß
MCoder
 
Das funktioniert genau so wenig.
Ich hatte auch nur MFC-DLL gewählt, da es der einzige Projekttyp im VisualStudio ist, der "DLL" enthält und ich sonst nicht weiß, wie ich eine DLL für Windows Mobile erstelle.

Welche anderen Wege gibt's denn da noch?


Gruß
Michael
 
Du kannst eine reine Win32-DLL erstellen. Als Projekttyp nimmst du eine Win32-Anwendung und kannst dann im nächten Schritt einstellen, dass es eine DLL sein soll. Die automatisch erstellen Sourcen lasse am besten in Ruhe und füge zu deinem Projekt lediglich eine (oder mehrere) CPPs hinzu, die deinen eigenen Code aufnehmen.

Gruß
MCoder
 

Neue Beiträge

Zurück