ERLEDIGT
JA
JA
ANTWORTEN
10
10
ZUGRIFFE
541
541
EMPFEHLEN
-
18.09.08 19:29 #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ß
MichaelGeä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) -
-
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:
GrußCode cpp:1 2 3 4 5
extern "C" _declspec(dllexport) int testfunktion(int x, int y) { TestApp testApp; return testApp.testfunktion(x, y); }
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
19.09.08 12:58 #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ß
MichaelGeä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) -
-
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
-
20.09.08 02:41 #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ß
MichaelDie 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) -
-
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
-
20.09.08 14:54 #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ß
MichaelDie 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) -
-
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
-
21.09.08 12:04 #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ß
MichaelDie 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) -
-
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
-
21.09.08 12:51 #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ß
MichaelGeä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
-
Schnelle intelligente Forumsuche mit Lucene
Von Thomas Darimont im Forum JavaAntworten: 2Letzter Beitrag: 10.09.09, 08:20 -
Intelligente Code Completion für Eclipse
Von Thomas Darimont im Forum JavaAntworten: 0Letzter Beitrag: 05.03.09, 23:00 -
Intelligente Diashow
Von stephan_s im Forum Sonstige Grafik-ProgrammeAntworten: 0Letzter Beitrag: 16.10.07, 16:34 -
intelligente Auswahlboxen
Von linux-lounge im Forum PHPAntworten: 1Letzter Beitrag: 18.06.05, 10:51





Zitieren
Login






