Hallo, ich bin ein totaler Anfänger und möchte wissen, wie man mit Visual C++ Express 2010 eine COM SCHNITTSTELLE zu einer Software beliebigen namens XYZ herstellen kann. Mein Vorhaben: Ich will mit Visual C++ Express 2010 eine GUI mit einem Button herstellen, womit ich bei einer externen Software ein Button aktiviere/deaktiviere. Meine Vorgehensweise: -- Ich erstelle ein Visual C++ Express 2010 Projekt und gehe unter CLR----> Windows Forms-Anwendung. Nachdem ich meiner GUI ein Button hinzugefügt habe, sieht meine GUI so aus [ANHANG 02]. -- Meinem Projekt tue ich noch die COM SCHNITTSTELLE unter Visual C++ Express 2010 verweisen auf folgende Art. '''''''''''''''''''''''''''''''''''''''''' Ich gehe auf Projektmappen-Explorer->CONNECTOR [siehe Abbildung 02]->rechte Maus->Verweise...->Neuen Verweis hinzufügen...CAN_MonitorApp Das ganze schließ ich dann alles mit OK ab. Es sieht dann folgendermaßen aus [Abbildung 01]. ''''''''''''''''''''''''''''''''''''''''''' Jetzt ist meine Frage, wie ich die bestehenden folgenden beiden C++ Codes ergänzen soll, damit das Programm funktionsfähig wird. Der Code der Windows-Forms-Anwendungs-GUI sieht folgendermaßen aus: ########################################################### #######_ANFANG_FORM1.h_#################################### #pragma once namespace ANWENDUNG { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; protected: private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(119, 54); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(282, 255); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { } }; } ##############ENDE__FORM1.h_############################# ######################################################### Die main-Datei sieht folgendermaßen aus: ######################################################### ######_ANFANG_Hauptprojektdatei_######################### // ANWENDUNG.cpp: Hauptprojektdatei. #include "stdafx.h" #include "Form1.h" using namespace ANWENDUNG; [STAThreadAttribute] int main(array<System::String ^> ^args) { // Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Hauptfenster erstellen und ausführen Application::Run(gcnew Form1()); return 0; } ############_ENDE_Hauptprojektdatei_##################### ######################################################### Ich weiß, dass ich jetzt auf die COM-Schnittstelle die COM-Schnittstelle CAN_MonitorApp verweise und ich weiß, dass ich noch die folgenden Sachen irgendwie den oberen Codes hinzufügen muss: ''''''''''''''''' CoInitialize(); oder auch CoInitialize(NULL); ''''''''''''''''' CoUninitialize(); ''''''''''''''''' HResult hr; hr = ::CoCreateInstance(CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, IID_IApplication, (void**)&m_IApplication); if(SUCCEEDED(hr)){ if (m_IApplication) { m_IApplication->Connect ( 1 ); //Mit Connect (1) wird der Button //aktiviert, wie ich verstanden habe. } } ''''''''''''''''' Bei weiteren Details oder Fragen, stehe ich gerne zur Verfügung. Würde mich sehr über konstruktive Hilfe bedanken. ---- Gebrülle (Großbuchstaben) aus Überschrift entfernt, Hinweis auf .Net angebracht. -rufus
Das ist kein C++!
1 | int main(array<System::String ^> ^args) |
Das hier ist aber C++
1 | HResult hr; |
2 | hr = ::CoCreateInstance(CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, |
3 | IID_IApplication, (void**)&m_IApplication); |
du musst dich also erstmal für die Sprache entscheiden.
Hallo, aber wie kann das sein, dass das nicht C++ ist? Ich habe ja alles in Visual C++ Express 2010 bearbeitet?
An Dre schrieb: > aber wie kann das sein, dass das nicht C++ ist? Das ist "C++/CLI". Heißt zwar irgendwie so wie C++, ist aber keines, sondern eine Microsoft-Sprache für .Net. Der Begriff "COM Schnittstelle" ist übrigens ungeschickt, da damit üblicherweise serielle Schnittstellen gemeint werden. Du willst ein Programm per Automation steuern. Das ist das Stichwort, nach dem Du suchen solltest. Für das Anklicken von Knöpfen in beliebiger Fremdsoftware ist das aber der falsche Ansatz, bei weitem nicht jedes Programm ist per Automation steuerbar, und wenn ein Programm so steuerbar ist, dann nicht seine GUI, sondern vom Entwickler des Programmes festgelegte Funktionen. Um Knöpfe anzuklicken, brauchst Du nur das Fensterhandle des Knopfes bzw. des den Knopf enthaltenen Fensters und musst mit PostMessage bzw. SendMessage eine WM_BUTTONDOWN-Nachricht senden. Wenn das Fenster seine Knöpfe selbermalt, musst Du hingegen Mausbewegungen und Mausklicks simulieren -- das machen Anwendungen wie z.B. AutoIt. Ach ja: Wir mögen hier kein Herumgebrülle. Texte in Versalien (Großbuchstaben) werden als Gebrülle wahrgenommen.
Ohjee, tut mir Leid, wegen des Herumgebrüllens. Es war mehr als ein ausrufen gemeint, um Aufmerksamkeit zu erwecken. Wie dem auch sei. Dieses Programm ist aber per Automation steuerbar. Ich habe es bereits mit Visual Basic kinderleicht geschafft, nur möchte ich viel lieber mit C++ das Programm steuern. Hintergrund ist, dass ich in dem zu steuernden Programm auch C++ benutzen muss und von daher gleich die Steuerung dieses Programms mit C++ vornehme, damit ich nicht verschiedene Sprachen lernen muss. Und es ist auch richtig, dass vom Entwickler festgelegte Funktionen vorgegeben sind. Diese Funktionen der Software XYZ muss ich von außen mittels Visual C++ oder Visual Basic steuern können. Mein oberster Ansatz muss schon irgendwie funktionieren. Nur, weiß ich nicht, wo ich genau das mit dem Hresult, etc. hin tun muss.
An Dre schrieb: > Dieses Programm ist aber per Automation steuerbar. Ich habe es bereits > mit Visual Basic kinderleicht geschafft, nur möchte ich viel lieber mit > C++ das Programm steuern. dann musst du halt noch mal neu einfangen und wirklich ein C++ programm anlegen wenn es c++ sein soll. Wenn nicht, dann kannst du auch gleich bei VB bleiben - es kommt am ende dann die gleiche exe raus. (Wenn es schon vb.net ist)
hmm, verstehe. Und wie kann ich dann ein reines C++ entwickeln mit Visual C++? Ich kannte bisher das Visual C++/CLI (.NET) nicht. Sind da die Unterschiede markant? Ist das MFC (Visual C++) das "reinere" C++? Ich verstehe nicht, wie ich das MFC in meiner Version starten kann? Muss ich das Visual C++ Express 2010 updaten oder so, damit da ein Asssistant vorhanden ist, womit man MFC Projekte anlegen kann? Und Guck, ich habe ja einfach Projekt gestartet und über den Button in der Abbildung 02.jpg (Siehe Anhang) einfach per Doppelklick auf den Button einen Code generieren lassen. Viel geschrieben habe ich da noch nicht.
An Dre schrieb: > Ist das MFC (Visual C++) das "reinere" C++? MFC ist eine Klassenbibliothek, die einen "echten" C++-Compiler voraussetzt. Allerdings kannst Du mit "Visual Studio Express" keine MFC-Anwendungen entwickeln, weil MS die dafür nötige Unterstützung entfernt hat. Der Compiler passt zwar, aber die Headerdateien, Libraries und App- und Classwizards fehlen alle. Das macht aber nichts, Du kannst anstelle der MFC auch wxWidgets oder Qt verwenden.
laut wiki:http://de.wikipedia.org: "Die kostenlose Visual C++ 2010 Express Edition kann direkt von Microsofts Webseite heruntergeladen und installiert werden. Diese Version bietet keine Unterstützung für die MFC-Klassenbibliothek und stellt laut Hersteller ein Werkzeug für den Hobby- und Einsteigerbereich dar." Ich informiere mich mal etwas über wxWidgets & Qt. Mir hat der Gedanke gefallen, dass ich nicht viel von ObjektOrientierter Programmierung (OOP) verstehen brauche und kinderleicht mit Visual einfach so GUIs erstellen kann und per Doppelklick ein Code entsteht, den man weiter bearbeiten braucht.
An Dre schrieb: > Sind da die Unterschiede markant? ja, die Frage ist warum es denn C++ sein soll. Wenn es keinen wirklichen Grund gibt dann mach es mit C# dort geht es so ähnlich wie in VB und ist die "echte" .net Sprache. > Ist das MFC (Visual C++) das "reinere" C++? Ich verstehe nicht, wie ich > das MFC in meiner Version starten kann? Muss ich das Visual C++ Express > 2010 updaten oder so, damit da ein Asssistant vorhanden ist, womit man > MFC Projekte anlegen kann? kann ich leider nicht sage, habe nicht die Express version installiert.
OK, die oben genannten Stichwörter sind gerade das, was ich vielleicht suche. Sind also komplett andere Software werkzeuge, mit denen ich jetzt GUIs anfertigen kann. Nur habe ich da noch überhaupt kein schimmer von. Die Software QT Project ist sogar von dieser eigentlich zu steuernden Software explicit genannt worden, als Werkzeug zur Herstellung der GUIs... Heisst es also, ich kann mit dieseen oben genannten Softwares eine Gui erstellen und die Software ist dann im Stande ein C++ Code zu erstellen, welchen ich so ergänzen muss, damit über eine Schnittstelle die Fremdsoftware angesteuert werden kann?
> ja, die Frage ist warum es denn C++ sein soll. Wenn es keinen wirklichen > Grund gibt dann mach es mit C# dort geht es so ähnlich wie in VB und ist > die "echte" .net Sprache. Wie gesagt, ich muss in der zu steuernden Software auch mit C++ arbeiten und wollte mich jetzt nicht in zig Sprachen einarbeiten. Alles einheitlich mit C++ zu bearbeiten wäre mir einfach lieber.
Heißt es eigentlich, dass die obere Datei in #######_ANFANG_FORM1.h_#################################### keine C++ ist? Und dass das mit dem Hresult als Ergänzung hier nicht möglich ist?
An Dre schrieb: > Wie gesagt, ich muss in der zu steuernden Software auch mit C++ arbeiten > und wollte mich jetzt nicht in zig Sprachen einarbeiten. Alles > einheitlich mit C++ zu bearbeiten wäre mir einfach lieber. Was heist "ich muss in der zu steuernden Software auch mit C++ arbeiten"? Aus .net kann man auch dlls aufrufen, es könnte also durchaus sinn machen die Gui mit c# zu machen und den Teil den du zwingen mit C++ machen musst in einer DLL auszulagern. Und wenn du bis jetzt "nur" VB gemacht hast, dann ist es nicht mal schnell auf C++ umgelernt. Ich will es dir nicht ausreden aber man kann sehr viele fehler in C/C++ machen wo man stunden lang mit fehlersuche verbingt. (speicher überschreiber, speicher nicht freigeben)
An Dre schrieb: > Heißt es eigentlich, dass die obere Datei in > #######_ANFANG_FORM1.h_#################################### > keine C++ ist? using namespace System; ist schon mal kein C / C++
> Was heist "ich muss in der zu steuernden Software auch mit C++ > arbeiten"? Es ist so, dass die zu steuernde Software XYZ Simulationen anstellt uund für diese Simulationen muss ich sogenannte Knoten mit C++ entwerfen. Von Außerhalb - z.B. mittels einer GUI - will ich ebend über Button auf diese Simulation einwirken.
An Dre schrieb: > Es ist so, dass die zu steuernde Software XYZ Simulationen anstellt uund > für diese Simulationen muss ich sogenannte Knoten mit C++ entwerfen. du weiss noch nich mal was C++ ist und musst irgendwelche dinge zwingend in dieser sprache machen? Wird bei euch gewürfelt wer was macht?
Ich muss ja nicht komplett anfangen, 1000 Seiten C++ Code zu schreiben. Es sind nur einige elementare Funktionen, die ich versuche in C++ zu schreiben. Ist mehr so eine Art Machbarkeitsstudie... D.h. dass auch der Aufwand für eine Machbarkeit bewertet werden soll....
An Dre schrieb: > Ich muss ja nicht komplett anfangen, 1000 Seiten C++ Code zu schreiben. > Es sind nur einige elementare Funktionen, die ich versuche in C++ zu > schreiben. Ist mehr so eine Art Machbarkeitsstudie... > D.h. dass auch der Aufwand für eine Machbarkeit bewertet werden soll.... das spricht doch alles dafür das man schnell in VB oder c# zu machen. Für eine Test C++ zu lernen ist ein wenig sinnlos. C++ ist nun mal nicht die sprache für Gui erstellung. C++ kennt keine gui. du musst dich also in WX, QT oder MFC einarbeiten und in C++.
> in dieser sprache machen? Wird bei euch gewürfelt wer was macht?
Übrigens, der war guuut, hab mich weggelacht^^
Peter II schrieb: > An Dre schrieb: >> Heißt es eigentlich, dass die obere Datei in >> #######_ANFANG_FORM1.h_#################################### >> keine C++ ist? > > using namespace System; > > ist schon mal kein C / C++ Wenn es den angegebenen Namespace gibt, ist es Ansi C++ (7.3.4 Using directive, scnr)... Damit alle wissen um was es anscheinend geht http://rbei-etas.github.com/busmaster/ Ansonsten: COM ist mit den .NET-Sprachen wie C# oder VB bzw. dank COM Interop imo etwas "angenehmer" http://msdn.microsoft.com/en-us/library/6bw51z5z(v=vs.100).aspx
> das spricht doch alles dafür das man schnell in VB oder c# zu machen.
Ok, hört sich sehr weise an.
Weil ich das mit VB schonmal kurz hingekriegt habe, werde ich dann dies
weiter verfolgen.
Wollte halt nur mit C++ alles einheitlich machen.
Anscheinend ist es garnicht mal so einfach mit C++ eine GUI herzustellen
und mit dieser über ein ein COM Interface eine Verbindung zu einer
anderen Software herzustellen.
Bei der zu steuernden Software wurde im Handbuch ebenfalls von Visual
Basic, C++, und QT Designer gesprochen.
Ich werde jetzt den Weg weiter verfolgen, mittels VB eine GUI zu
erstellen, und mittels C++ die Knoten in der zu steuernden Software zu
programmieren.
Vielen Dank für die rege Teilnahme, wart eine seeeehr große Hilfe ;-)
Arc Net schrieb: > Peter II schrieb: >> An Dre schrieb: >>> Heißt es eigentlich, dass die obere Datei in >>> #######_ANFANG_FORM1.h_#################################### >>> keine C++ ist? >> >> using namespace System; >> >> ist schon mal kein C / C++ > > Wenn es den angegebenen Namespace gibt, ist es Ansi C++ (7.3.4 > Using directive, scnr)... oh mist, da war wohl die falsche zeile in der zwischenablage public ref class Form1 : public System::Windows::Forms::Form ist aber kein C++ außer man defined ref weg.
> Damit alle wissen um was es anscheinend geht > http://rbei-etas.github.com/busmaster/ In der Tat handelt es sich um die Opensource Software RBEI BUSMASTER!!!
Hallo, habe es jetzt endlich geschafft mit Visual C++ Express 2010 eine GUI zu erstellen, mit der man einen Button einer externen Software betätigen bzw. an und ausschalten kann. Hinweis: Wenn man das Projekt herunterlädt und es startet, könnte es sein, dass der nötige Verweis zu der COM Schnittstelle noch nicht existiert. Dies kann auf folgende Art nachrtäglich geschehen: Siehe aller ersten Beitrag oben Datum: 12.02.2013 15:50 und zugehöriges Bild 01.jpg. Bin happy, dass ich dies hingekriegt habe. Auch danke ich allen Beteiligten für alle Hinweise. Zwar habe ich dies hingekriegt, jedoch weiß ich jetzt aus oberen Beiträgen, dass es sich bei Visual C++ Express 2010 nicht um das reine C++ handelt sondern um C++/CLI. Was mein Vorhaben nur mit reinem C++ eine GUI zu kreieren nur mangelhaft befriedigt.
An Dre schrieb: > dass es sich bei Visual C++ Express > 2010 nicht um das reine C++ handelt sondern um C++/CLI. Visual C++ ist eine IDE, keine Sprache. Entwickeln kannst du damit sowohl C++ als auch C++/CLI.
Boris B. schrieb: > An Dre schrieb: >> dass es sich bei Visual C++ Express >> 2010 nicht um das reine C++ handelt sondern um C++/CLI. > > Visual C++ ist eine IDE, keine Sprache. Entwickeln kannst du damit > sowohl C++ als auch C++/CLI. Aber alleine die Zeile mit // public ref class Form1 : public System::Windows::Forms::Form // ist ja schon kein reines C++. Das ist ja das, was mich ärgert.
Wohingegen QT Creator das reinere C++ ist, nehm ich an (bin da jetzt auch kein Experte in Programmiersprachen)
An Dre schrieb: > public ref class Form1 : public System::Windows::Forms::Form Ich weiß jetzt nicht wo du diese Zeile her hast, aber das hat doch mit der IDE nichts zu tun? Scheint mir einfach ein C++/CLI Projekt zu sein...
Naja, ich bin so vorgegangen, dass ich bei Visual C++ Express 2010 einfach ein neues Projekt geöffnet habe und dann weiter auf CLR und dann weiter eine Windows-Forms Anwendung gestartet habe. Bei dieser Windows Forms Anwendung konnte ich dann einfach Buttons etc auf ein freies GUI-Fenster per Drag&Drop ziehen und so meinen Code (nehme an C++/CLI) automatisch erzeugen lassen. Jedesmal, wenn ich andere Projekte als CLR startete und dann eine Form einbinde, dann sagt mir Visual C++, dass ein CLR Projekt eingebunden wird bzw werden muss. Also, dass anscheinend ein C++/CLI Code geschrieben wird, welcher sich dann von dem reinen C++ Code unterscheidet.
OK, wenn du ein C++/CLI Projekt anlegst bekommst du natürlich auch C++/CLI Code ;-) Versuch's mal mit einem neuen Projekt vom Typ "Win 32". Dann hast du klassisches C++.
Boris B. schrieb: > Versuch's mal mit einem neuen Projekt vom Typ "Win 32". Dann hast du > klassisches C++. dann hat er aber kein MVC weil er nur die Express version hat und wie soll er dann seine GUI machen?
Peter II schrieb: > dann hat er aber kein MVC weil er nur die Express version hat und wie > soll er dann seine GUI machen? MVC? Ist doch nur ein Pattern, und vom Framework weitestgehend unabhängig. Seine GUI kann er dann z.B. mit Win32, MFC, wxWidgets, Qt etc. machen...
ich gebe Peter recht:
Autor: Peter II (Gast)
Datum: 18.02.2013 12:59
Aber dein letzter Beitrag ist auch interessant.
Ich verstehe das so, dass ich eine GUI mit den oben genannten Werkzeugen
anlege und diese dann irgenwie zu meiner Express Verion einbinde.
PROBLEM:
Ich bin kein Experte und würde mir den Kopf zerbrechen, irgendwie zwei
getrennte Softwarewerkzeuge miteinander verschmelzen zu lassen.
Bequemer will ichs haben, indem ich per drag&drop buttons etc einwerfe
und mir der Code automatisch generiert wird und ich nicht weiter viel
nahcdenken muss...
Oder wie meinst du das mit
//
>Win32, MFC, wxWidgets, Qt
//
Wenn ich ein Win32-Projekt beginne, und eine Gui einbinden will, dann
ist es wieder ein CLR Projekt. Da komm ich doch nicht drum rum....
An Dre schrieb: > Wenn ich ein Win32-Projekt beginne, und eine Gui einbinden will, dann > ist es wieder ein CLR Projekt. Da komm ich doch nicht drum rum.... Das Einbinden einer GUI ändert nichts an deinem Projekttyp oder der Programmiersprache die dein Projekt verwendet. Wenn du die GUI per Drag & Drop bauen willst, musst du ein GUI Framework verwenden, für dass es einen entsprechenden Designer gibt. Da ist es unter C++ natürlich eher schwierig (Qt wäre eine Möglichkeit). Sinnvoller wäre es aber, eine andere Sprache zu verwenden. Wer GUIs bauen möchte, sollte nicht in erster Linie an C++ denken. Da gibt es weitaus geeignetere Möglichkeiten: C#, VB, Delphi usw. Wenn du einen Nagel in die Wand hauen willst greifst du ja auch nicht zur Rohrzange (geht zwar, ginge aber auch wesentlich besser)...
Ich habe bereits eine kleine GUI in VB VC++ hingekriegt. Bleibt nur noch die QT Variante übrig. Am Ende wird ausgesiebt und dann entscheide ich mich für die komfortableste Variante. Jedoch habe ich gerade bei der QT Variante noch etwas zu kämpfen (Absturzmeldung). Beitrag "Re: QT Creator 5.0.1 cl error"
Erwähnen muss ich, dass der Code in QT mir etwas mehr sagt, als der von VC++ 2010 express.
Microsoft stellt eine Klasse "Serialport" zur Verfügung mit Beisspiel: http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1 http://www.youtube.com/watch?v=cxgKTWTHX1w http://sourceforge.net/projects/kle8309/?source=dlp
Guten Tag zusammen! Ich beschäftige mich zur Zeit ebenfalls mit dem Thema BUSMASTER v3.0.0 in Verbindung mit einer GUI u.a. über Visual Studio Community 2015. Leider schaffe ich es einfach nicht überhaupt eine Kommunikation zu erstellen (weder in VB, C++ oder C#). Das Hauptproblem scheint zu sein, dass ich den Verweis zur CAN_MonitorApp nicht einfügen kann, da dieser Verweis nicht vorhanden ist. An D. schrieb: > Ich gehe auf Projektmappen-Explorer->CONNECTOR [siehe Abbildung > 02]->rechte Maus->Verweise...->Neuen Verweis hinzufügen...CAN_MonitorApp > Das ganze schließ ich dann alles mit OK ab. Es sieht dann folgendermaßen > aus [Abbildung 01]. Ich kann diese Datei einfach nicht finden oder erzeugen. Ich habe schon verschiedene VS Versionen durchprobiert aber kam nicht zum Erfolg. Ich freue mich über jede Information! Grüsse, Jonas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.