tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
541
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jul 2004
    Ort
    Minden, Westf.
    Beiträge
    173
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    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
    Geändert von Freak_Desperado (18.09.08 um 19:33 Uhr) Grund: Grammatikfehler
     
    Die rekursive Definition der Iterationstransformation ist ein Hinweis darauf, dass die Iteration das Gegenstück zu rekursiven Funktionsaufrufen bei applikativen Algorithmen ist.

    - Gunter Saake & Kai-Uwe Sattler (Algorithmen und Datenstrukturen) -

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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:
    Code cpp:
    1
    2
    3
    4
    5
    
    extern "C" _declspec(dllexport) int testfunktion(int x, int y)
    {
        TestApp testApp;
        return testApp.testfunktion(x, y);
    }
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    Registriert seit
    Jul 2004
    Ort
    Minden, Westf.
    Beiträge
    173
    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
    Geändert von Freak_Desperado (19.09.08 um 15:29 Uhr) Grund: Hab's nun ausprobiert.
     
    Die rekursive Definition der Iterationstransformation ist ein Hinweis darauf, dass die Iteration das Gegenstück zu rekursiven Funktionsaufrufen bei applikativen Algorithmen ist.

    - Gunter Saake & Kai-Uwe Sattler (Algorithmen und Datenstrukturen) -

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Ja, du solltest die Funktion deklarieren. Das kannst du der Einfachheit halber am Anfang der cpp-Datei machen, welche die Funktion implementiert.


    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  5. #5
    Registriert seit
    Jul 2004
    Ort
    Minden, Westf.
    Beiträge
    173
    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
     
    Die rekursive Definition der Iterationstransformation ist ein Hinweis darauf, dass die Iteration das Gegenstück zu rekursiven Funktionsaufrufen bei applikativen Algorithmen ist.

    - Gunter Saake & Kai-Uwe Sattler (Algorithmen und Datenstrukturen) -

  6. #6
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  7. #7
    Registriert seit
    Jul 2004
    Ort
    Minden, Westf.
    Beiträge
    173
    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
     
    Die rekursive Definition der Iterationstransformation ist ein Hinweis darauf, dass die Iteration das Gegenstück zu rekursiven Funktionsaufrufen bei applikativen Algorithmen ist.

    - Gunter Saake & Kai-Uwe Sattler (Algorithmen und Datenstrukturen) -

  8. #8
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  9. #9
    Registriert seit
    Jul 2004
    Ort
    Minden, Westf.
    Beiträge
    173
    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
     
    Die rekursive Definition der Iterationstransformation ist ein Hinweis darauf, dass die Iteration das Gegenstück zu rekursiven Funktionsaufrufen bei applikativen Algorithmen ist.

    - Gunter Saake & Kai-Uwe Sattler (Algorithmen und Datenstrukturen) -

  10. #10
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  11. #11
    Registriert seit
    Jul 2004
    Ort
    Minden, Westf.
    Beiträge
    173
    Besten Dank!
    Das werde ich doch gleich mal ausprobieren.
    Und die DLL kann ich dann auch unter Windows Mobile benutzen?

    [Edit]
    Viielen vieelen Dank!
    Hat nun endlich funktioniert.
    Die Aufrufe funktionieren.
    [/Edit]

    Gruß
    Michael
    Geändert von Freak_Desperado (21.09.08 um 14:17 Uhr) Grund: Hat funktioniert :)
     
    Die rekursive Definition der Iterationstransformation ist ein Hinweis darauf, dass die Iteration das Gegenstück zu rekursiven Funktionsaufrufen bei applikativen Algorithmen ist.

    - Gunter Saake & Kai-Uwe Sattler (Algorithmen und Datenstrukturen) -

Ähnliche Themen

  1. Schnelle intelligente Forumsuche mit Lucene
    Von Thomas Darimont im Forum Java
    Antworten: 2
    Letzter Beitrag: 10.09.09, 08:20
  2. Intelligente Code Completion für Eclipse
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 05.03.09, 23:00
  3. Intelligente Diashow
    Von stephan_s im Forum Sonstige Grafik-Programme
    Antworten: 0
    Letzter Beitrag: 16.10.07, 16:34
  4. intelligente Auswahlboxen
    Von linux-lounge im Forum PHP
    Antworten: 1
    Letzter Beitrag: 18.06.05, 10:51