myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » C++ Dll in C# Compact Framework nutzen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

C++ Dll in C# Compact Framework nutzen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
maume maume ist männlich
myCSharp.de-Mitglied

avatar-2464.gif


Dabei seit: 23.11.2006
Beiträge: 11
Entwicklungsumgebung: Visual Studio 2005
Herkunft: nähe Bonn


maume ist offline

C++ Dll in C# Compact Framework nutzen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich habe eine in C++ geschriebene Dll, die ich im C# Compact Framework nutzen will.
Grundsätzlich ist das auch kein Problem, da dies über DLLImport geht.

Allerdings ist der Aufbau einer Funkion der DLL wie folgt:

Code:
1:
int Anmelden(char *ergebnis, char *bmp);

Wie kann ich nun einen Pointer auf die Variable übergeben?

Gruß
maume
18.08.2008 15:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Leider sind C-Signaturen nicht aussagekräftig genug um deine Frage ohne weitere Informationen (in/out) zu beantworten.

Wenn aber dein Parameter ein vorallokiertes Char-Array ist, welches von der Funktion gefüllt werden soll (zumindest ergebnis scheint so ein out-Kandidat zu sein) dann musst du StringBuilder verwenden. Also ein StringBuilder-Objekt mit der passenden Länge erzeugen und reinstecken.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von svenson am 19.08.2008 15:19.

19.08.2008 15:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
maume maume ist männlich
myCSharp.de-Mitglied

avatar-2464.gif


Dabei seit: 23.11.2006
Beiträge: 11
Entwicklungsumgebung: Visual Studio 2005
Herkunft: nähe Bonn

Themenstarter Thema begonnen von maume

maume ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habe nun folgenden Code:

C#-Code:
[DllImport("terminal.dll")]
unsafe private static extern int Anmelden(ref StringBuilder ergebnis, ref StringBuilder bmp);

C#-Code:
StringBuilder ergebnis = new StringBuilder(2);
StringBuilder bmp = new StringBuilder(257);

C#-Code:
i = Anmelden(ref ergebnis, ref bmp);

Wenn ich das nun ausführe geht auch alles gut, bis zum Aufruf von Anmelden.
Da bekomme ich als Exception

Can't find PInvoke DLL 'terminal.dll'.

Die DLL liegt im gleichen Verzeichnis, wie die ausgeführte EXE.

Könnt ihr mir damit auch helfen?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von maume am 20.08.2008 09:50.

20.08.2008 09:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die Fehlermeldung tritt auch auf, wenn nicht genug Speicher zur Verfügung steht um die DLL zu laden.
20.08.2008 10:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
maume maume ist männlich
myCSharp.de-Mitglied

avatar-2464.gif


Dabei seit: 23.11.2006
Beiträge: 11
Entwicklungsumgebung: Visual Studio 2005
Herkunft: nähe Bonn

Themenstarter Thema begonnen von maume

maume ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Kann es evtl. auch damit zu tun haben, dass die DLL ursprünglich für Win32 geschrieben ist?
Dann müsste ich den Entwickler noch mal ansprechen, ob ich die DLL auch für WinCe haben kann.
26.08.2008 09:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Default-Marshalling auf CE ist Unicode. char* ist aber ANSI. Also CharSet=CharSet.Ansi im DLLImportAttribute.
26.08.2008 15:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
maume maume ist männlich
myCSharp.de-Mitglied

avatar-2464.gif


Dabei seit: 23.11.2006
Beiträge: 11
Entwicklungsumgebung: Visual Studio 2005
Herkunft: nähe Bonn

Themenstarter Thema begonnen von maume

maume ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich kann im DLLImport aber nur Unicode oder Auto einstellen.

Wenn ich das ganze nun so mache

C#-Code:
[DllImport("terminal.dll", CharSet = CharSet.Auto,SetLastError= true, EntryPoint = "Anmelden")]
unsafe private static extern int Anmelden(ref StringBuilder ergebnis, ref StringBuilder bmp);

kommt leider immer noch die PInvoke Exception.
26.08.2008 16:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Stimmt. Dann empfehle ich: Benutze die OpenNETCF-Lib. Da gibts die Klasse Marshal2 und dort eine Funktion PtrToStringAnsi().

Dann musst du anstelle des StringBuilders den Parameter IntPtr nutzen. Mittels Marshal.AllocGobalH Speicher reservieren und dann via IntPtr übergeben. Nach unmanaged Aufruf mit PtrToStringAnsi() den Inhalt des Speichers in einen String kopieren. Dann den Speicher mit MArshal.FreeGlobalH freigeben.

Leider wäre es natürlich die unmanaged Funktion in Unicode zu ändern (wchar*).

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von svenson am 26.08.2008 23:33.

26.08.2008 23:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Jahre.
Der letzte Beitrag ist älter als 11 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.10.2019 14:23