Problem bei DLL mit CLR Call
-
Hallo also ich möchte eine kleine DLL erzeugen und habe mir da zunächst das Tutiorial hier:
http://msdn.microsoft.com/de-de/library/ms235636(v=vs.80).aspx
angesehen und erfolgreich zum laufen gebrachtNun wollte ich das Beispiel abändern, jetzt habe ich aber folgendes Problem in dem Beispiel ist man ohne Common Language Runtime augekommen ich brauche das aber. nun kommt beim kompalieren von meiner Header-Datei:
namespace ArduinoFuncs { using namespace System; class MyArduinoFuncs { public: // steuert die serielle Kommunikation mit einem Arduino-Board static __declspec(dllexport) String^ kommunikation(String^ outString, String^ altString, bool kommunikation); }; }
natürlich folgender Fehler:
error C3395: 'ArduinoFuncs::MyArduinoFuncs::kommunikation' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling conventionKann mir jemand helfen das zu umgehen, aus der Compilerfehlerbibliothek http://msdn.microsoft.com/de-de/library/ze0zzybc.aspx
kann ich auch nicht entnehmen was geändert werden müsste.Ich danke schon mal für alle Antworten
-
Ganz einfach, entscheide Dich: ENTWEDER eine managed Klasse ODER eine native Klasse. Die managed Klasse wird "exportiert" sobald sie public ist, bei der nativen Klasse kannst Du __decclspec(dllexport/dllimport) benutzen.
Generell ist C++/CLI nur für Interop zwischen der managed und nativen Welt geeignet. Ist das bei Dir der Fall? Was möchtest Du erreichen?
Vorbeugend: http://www.c-plusplus.net/forum/263084
-
also mein Ziel ist es über die Serielle Schnittstelle von einem Arduino-Board anfrage-Signale an den PC senden und dieser antwortet je nach Zustand des Rechners mit einem entsprechenden Antwort-Signal, welches vom Board ausgewertet wird. Auf meinem Board ist alles soweit funktionstüchtig. Nun soll die besagte DLL erstellt werden die die Kommunikation regelt.
Ob nun managed Klasse oder native Klasse ist mir eig egal... was wäre geeigneter?
ich möchte nur eines das funktioniert. Was muss ich dafür tun bzw weg lassen?hoffe das sind alle infos die ihr braucht um mir helfen zu können, danke
Vorbeugend: http://www.c-plusplus.net/forum/263084
kenne ich schon
-
Da würde ich gleich C# benutzen. Falls das nicht möglich ist, würde ich eine (native) C++ Konsolen Applikation erstellen.
Für die Kommunikation über den seriellen Port gibts bei C# die Klasse System.IO.Ports.SerialPort (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx).
Unter (native) C++ kann ich die Serial library for C++ aus einem Code Project Aritkel (http://www.codeproject.com/Articles/992/Serial-library-for-C) sehr empfehlen. Falls Du sowiso Boost einsetzt gibts aber dort auch eine Implementation bei Boost.Asio (http://www.boost.org/libs/asio).
-
ich nutze schon die Serial libary von codeproject und das gibt auch alles keine Fehlermeldung, mir geht es "nur" um den besagten Fehler.
error C3395: 'ArduinoFuncs::MyArduinoFuncs::kommunikation' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention
Mit der Seriellen Kommunikation an sich dürfte alles Funktionieren.
C# habe ich schon gelesen das es da einfacher sein soll aber nun habe ich ja eig fast alles soweit fertig und so schlimm war es denk der Libary wirklich nicht da würde ich das ganze nur ungern nochmal umschreiben... kann ich also einfach meinen bestehenden Code so abändern das es funktioniert?
Danke
-
Ok, dann würde ich sagen:
Falls Du deine Library (welche die Serial Kommunikation kapselt) in einem (nativen) C++ Projekt benutzen möchtest soll deine Library natürlich auch eine native Library sein. D.h. Erstelle ein neues Projekt (Win32 Konsole Project) und wähle dort DLL oder falls es dir lieber ist Static Library (wäre dann noch einfacher).Deine DLL managed zu machen (/clr) bringt nur was, wenn Du sie z.B. in einer C# Applikation verwenden möchtest. Dann wirds allerdings langsam komplizierter.
Edit
Noch ein wenig konkreter, Du kannst keine managed Typen (z.B. System::Blabla oder die mit ^) in Funktionen verwenden die Du native exportieren möchtest!
-
ok werds mal so versuchen, danke schon mal ich meld mich wenn ich nicht weiter komme
-
Hi ich wieder, ich bin leider wegen Urlaub und dem schönen Wetter leider nicht oft dazu gekommen weiter zu machen. Also die DLL an sich funktioniert ohne Fehlermeldung auch das aufrufende Programm zum testen macht was es soll, danke an theta.
Nun habe ich jedoch noch ein Problem, ich weiß nicht ob das jetzt hier fehl am Platze ist aber hier steht einmal meine Thematik. Für die serielle Kommunikation verwende ich die Klasse CSerial:
Fehlermeldungen hab ich keine aber ich erhalte keine Kommunikation da der Port nicht geöffnet wird
CSerial serialPort1; int nPort = 4; int nBaud=9600; serialPort1.Open(nPort, nBaud); //hier erhalte ich immer false als Rückgabewert
kennt sich jemand mit CSerial aus, warum der False-Wert, also warum lässt der Port sich nicht öffenen? (Das Board hängt definitiv an Port 4 und die Baudrate stimmt auch)
Woran kann das liegen?
-
WIe wäre es mit Debuggen und auswerten von "GetLastError"?
-
GetLastError liefert "D"
und was soll ich daraus jetzt schließen?Google sagt mir auch nicht wirklich was das bedeuten soll
-
GetLastError liefert eine Zahl und kein Zeichen...
-
McKay schrieb:
GetLastError liefert "D"
GetLastError() liefert keinen String. Die Dokumentation dazu wird dir verraten, was genau es liefert...