Forum: PC-Programmierung c++ - Form aus Konsolenanwendung starten


von Tom A. (thomas_a)


Lesenswert?

Hallo,
ich habe ein C++ Projekt als Konsolenanwendung entwickelt. Jetzt möchte 
ich dieser Klasse ein UI verpassen und die funktionen, welche ich 
entwickelt hab mittels Buttons aufrufen. Soweit so gut.

Ich hab mit Hinzufügen->Neues Element -> Windows Form das Form erstellt. 
Das funktionierte wunderbar.

Jetzt wollte ich das Form aus meiner main()-Funktion öffnen. Also wollte 
ich mit
1
#include "gui.h"
 das UI bekannt machen. Jetzt kommen allerdings die folgenden 
Fehlermeldungen:

Fehler  1  error C2871: 'System': Es ist kein Namespace mit diesem Namen 
vorhanden  c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  3

Fehler  7  error C2871: 'Forms': Es ist kein Namespace mit diesem Namen 
vorhanden  c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  6

Fehler  11  error C2871: 'Drawing': Es ist kein Namespace mit diesem 
Namen vorhanden  c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  8

Fehler  9  error C2871: 'Data': Es ist kein Namespace mit diesem Namen 
vorhanden  c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  7

Fehler  3  error C2871: 'ComponentModel': Es ist kein Namespace mit 
diesem Namen vorhanden  c:\thomas\sw\kopie von 2011-01-04 
hsi_gui\host\gui.h  4

Fehler  5  error C2871: 'Collections': Es ist kein Namespace mit diesem 
Namen vorhanden  c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  5

Fehler  2  error C2653: 'System': Keine Klasse oder Namespace 
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  4

Fehler  4  error C2653: 'System': Keine Klasse oder Namespace 
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  5

Fehler  6  error C2653: 'System': Keine Klasse oder Namespace 
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  6

Fehler  8  error C2653: 'System': Keine Klasse oder Namespace 
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  7

Fehler  10  error C2653: 'System': Keine Klasse oder Namespace 
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  8

Fehler  14  error C2653: 'System': Keine Klasse oder Namespace 
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  22

Fehler  16  error C2447: '{': Funktionsheader fehlt - Parameterliste im 
alten Stil?  c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  23

Fehler  15  error C2143: Syntaxfehler: Es fehlt ';' vor '{' 
c:\thomas\sw\kopie von 2011-01-04 hsi_gui\host\gui.h  23

Fehler  12  error C2059: Syntaxfehler: 'public'  c:\thomas\sw\kopie von 
2011-01-04 hsi_gui\host\gui.h  22

Fehler  13  error C2059: Syntaxfehler: 'public'  c:\thomas\sw\kopie von 
2011-01-04 hsi_gui\host\gui.h  22

Was habe ich falsch gemacht? Hat jmd. eine Idee?
Ich versuche mich mal weiter.

Grüße Tom

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte es sein, daß Du C++ und das .Net-Geraffel in Form von "Managed 
C++" bzw. "C++/CLI" versuchst zu mischen?

von Karl H. (kbuchegg)


Lesenswert?

Tom A. schrieb:

> Jetzt wollte ich das Form aus meiner main()-Funktion öffnen. Also wollte
> ich mit
1
#include "gui.h"
 das UI bekannt machen. Jetzt kommen
> allerdings die folgenden Fehlermeldungen:

Seh ich das richtig, dass du versuchst eine Konsolenanwendung mit einer 
GUI zu pimpen?

Normlerweise ist das keine gute Idee.

Lass dir vom Wizard eine GUI Anwendung generierern und bau dann die 
Teile aus deiner Konsolenanwendung dort ein, wo du sie brauchst.

Also genau anders rum:
Nicht die Konsolenanwendung pimpen.
Sondern eine frische GUI-Lösung mit Funktionalität pimpen (die du in 
Form eines Konsolenprogramms schon getestet hast und somit weitgehend 
einfach übernehmen kannst)

Grund: Der ganze Projektaufsatz (Compiler-Einstellungen, 
Linker-Einstellung, sonstiges) ist bei GUI-Projekten ein wenig anders. 
Sowas in einer Konsolenanwendung nachzurüsten ist viel Arbeit, bei der 
man gerne was übersieht. Daher lässt man sich das vom Wizzard einfach 
neu generieren, das geht schneller als anders rum.

von Tom A. (thomas_a)


Lesenswert?

Ok, vielen Dank für den Tipp, dann werde ich es mal auf diese Weise 
versuchen ;)

Grüße Tom

von Rolf Magnus (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Nicht die Konsolenanwendung pimpen.
> Sondern eine frische GUI-Lösung mit Funktionalität pimpen (die du in
> Form eines Konsolenprogramms schon getestet hast und somit weitgehend
> einfach übernehmen kannst)

Der Königsweg: Die Funktionalität in eine Bibliothek auslagern und dann 
in GUI und Konsolenprogramm verwenden.

von Tom A. (thomas_a)


Lesenswert?

Ok,
also ich hab es versucht meine Klasse einzubinden. Das hat glaube ich 
funktioniert. Jetzt habe ich aber ein Problem. Meine Klasse verwendet 
eine Libary (CyAPI.lib).

Ich hab den dazugehörigen Header eingefügt und es scheint soweit zu 
funktionieren, dass die Funktionen usw. erkannt werden.

Jetzt habe ich aber das Problem, dass diese Funktionen einen 
Rückgabewert haben, den VS nicht kennt ...

Davon bekomme ich jetzt an die 200 Fehlermeldungen bis das compilieren 
abgebrochen wird ...

Hier mal eine von vielen Fehlermeldungen.
Fehler  42  error C4430: Fehlender Typspezifizierer - int wird 
angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. 
c:\dokumente und einstellungen\albrec\eigene dateien\visual studio 
2008\projects\hsi_ui\hsi_ui\CyAPI.h  28

So wie ich das sehe sind VS die ganzen Datentypen UCHAR PUCHAR usw. 
nicht mehr bekannt.

Hat jmd. eine Idee wo das problem sein könnte?

Vielen Dank schon mal für die Anregungen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Tom A. schrieb:
> Hat jmd. eine Idee wo das problem sein könnte?

Passende deklaration erzeugen
1
#define default-int int
oder irgenwoher "ausleihen", häufig gibt es passende Header irgenwo zum 
DL z.B. für die stdint typen.

von Tom A. (thomas_a)


Lesenswert?

mh... es ging aber doch davor auch.
außerdem ist es kein int sondern ein andere Datentyp z.b. UCHAR und wenn 
ich dann #define UCHAR unsigend char mache muss ich ja dass dann für 
alle Datentypen und Datenstruckturen machen ... Das kann ja nicht sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tom A. schrieb:
> außerdem ist es kein int sondern ein andere Datentyp z.b. UCHAR und wenn
> ich dann #define UCHAR unsigend char mache muss ich ja dass dann für
> alle Datentypen und Datenstruckturen machen ... Das kann ja nicht sein.

Du hast vermutlich vergessen, die diese Dinge definierende Headerdatei 
vor CyApi.h einzubinden.

Das sollte durch #include <windows.h> erledigt sein.

von Tom A. (thomas_a)


Lesenswert?

mh... ok, das hat mich ein paar Fehlermeldungen weitergebracht. Aber 
immer noch nicht ans endgültige Ziel.

Hab die folgenden Fehlermeldungen im moment und ein paar mehr.

Fehler  11  fatal error LNK1120: 10 nicht aufgelöste externe Verweise. 
C:\Dokumente und Einstellungen\albrec\Eigene Dateien\Visual Studio 
2008\Projects\HSI_UI\Debug\HSI_UI.exe
Fehler  5  error LNK2028: Nicht aufgelöstes Token (0A000043) ""public: 
void __clrcall CCyUSBDevice::Close(void)" 
(?Close@CCyUSBDevice@@$$FQAMXXZ)", auf das in Funktion ""public: int 
__clrcall USBDev::send_cmd2Dev(void)" (?send_cmd2Dev@USBDev@@$$FQAMHXZ)" 
verwiesen wird.  USBDev.obj


Was mich hier verwirrt ist die erste. Hab ich vll. die lib falsch 
eingebunden? In meinem ersten Projekt mit der Klasse musste ich nirgends 
einen Pfad hinzufügen oder so was... Einfach vorhandenes Element und 
dann die lib angeklickt. Dann ist sie im Projektordner und kann 
verwendet werden.

Wenn ich sie dort rauslösche kommt "fatal error LNK1120: 1 nicht 
aufgelöste externe Verweise." - So bin ich darauf gekommen, dass die lib 
vll. falsch eingebunden ist...!?

Hat das was mit dem vorkompilierten Header zutun? Weil aus dem Grund 
musste ich ja meine header dateien auch in ein anderes File machen. Vll. 
geht es deshalt micht mehr!?

Ich hoffe jmd. kann mir nochmal einen guten Tipp geben :-/

Tom

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Tom A. schrieb:
> LNK1120: 10 nicht aufgelöste externe Verweise
Der Linker findet die Library oder andere extern erzeugte Bibliotheken 
nicht, schau mal nach den Includepfaden.

von Tom A. (thomas_a)


Angehängte Dateien:

Lesenswert?

mh... das passt eigentlich. Also ich hab den Ordner angegeben, in 
welcher die Libary liegt.
Hab ich da sonst was falsch eingestellt? (siehe Abbildung)

Beim Konsolen Projekt musste ich aber nichts der gleichen einstellen. 
Ich kopiere es einfach rein. Das verwirrt mich ein wenig.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es genügt nicht, das Verzeichnis anzugeben, in dem die Library liegt - 
der Linker muss auch noch wissen, daß er die Library überhaupt anfassen 
soll.

von Tom A. (thomas_a)


Lesenswert?

mh... das passiert aber doch über die HEader datei oder nicht?

ich hab die HEader datei "CyAPI.h" in der Klasse wo die lib benötigt 
wird. Ansonsten habe ich auch nichts gefunden. Wo muss ich das sonst 
noch angeben?

von Markus V. (Gast)


Lesenswert?

Nein, über die Header-Datei findet der Linker die Library nicht. Du 
musst in den Projekteinstellungen unter Linker / Input noch die passende 
Library angeben.

Gruß
Markus

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Eine Alternative, die bei Verwendung von MS-Compilern funktioniert, ist 
folgendes:

  #pragma comment(lib, "cyapi.lib")

Wird so eine Zeile im Sourcecode vorgefunden, erzeugt der Compiler in 
der betreffenden Objektdatei einen Hinweis für den Linker, daß die so 
benannte Library zu linken ist.
Diese wird dann vom Linker im Library-Suchpfad gesucht und gelinkt.

Allerdings ist das eine MS-spezifische Funktionalität, die Nutzern 
anderer Compiler nicht zur Verfügung steht.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
also ich bin wirklich am verzweifeln. Es scheint so, dass ich 
irgendetwas falsch mache. Evtl. kann einer von euch das Projekt mal kurz 
anschauen und schauen ob es bei euch geht? Bzw. was ich falsch mache.


Es wäre mir wirklich eine sehr große Hilfe. Vll. habe ich beim Projekt 
anlegen auch schon ein Fehler gemacht.

Ich versuchs gleich nochmal mit einem neuen projekt...

Danke schonmal im vorraus.

Grüße tom

von Markus V. (valvestino)


Lesenswert?

Also, was mir bei Deinem Projekt aufgefallen ist: Es handelt sich um ein 
Managed C++ Projekt (.net-C++). Ist das gewollt? Ich kenne mich mit dem 
Mist nicht wirklich aus. C# ok, unmanaged C++ (native C++) vielleicht 
auch noch ein wenig, aber bei managed C++ muß ich passen. Was mir etwas 
suspekt vorkommt ist das Hinzubinden einer unmanaged Library zu einem 
managed Projekt. Aber vielleicht geht das ja.

Ich habe übrigens (in VS2010) die Anzahl der "unresolved externals" (ich 
habe ein englisches VS2010) auf 2 reduzieren können: Bei den 
Projekt-Eigenschaften unter "General" (Allgemein?) bei "Common Language 
Runtime Support" habe ich den Wert "Common Language Runtime Support 
(/clr)" eingestellt. Außerdem habe ich unter "Linker" bei "Additional 
Library Directories" (Zusätzliche Bibliotheksverzeichnisse?) "$(OutDir)" 
eingetragen. Das ist etwas sauberer wie "J:\...". Die verbleibenden 2 
unresolved externals rühren wohl von einer weiteren fehlenden Library 
her, wie mir scheint, eine mit Winapi-Funktionen.

Gruß
Markus

von Bernd (Gast)


Lesenswert?

Nimm Qt 4 und werde glücklich, sofern noch nicht.

von Tom A. (thomas_a)


Lesenswert?

mh... managed Projekte...

Also ehrlich gesagt hab ich noch nie richtig eine Oberfläche 
programmiert.
Und allgemein bin ich ehr der "Bitschuppser" unter den Programmieren. 
d.h. ich hab eh µC, DSP usw. programmiert. Aus diesen Gründen kenne ich 
mich damit nicht so gut aus.

Ich hab mal eine Oberfläche zusammen gezogen, aber da hatte ich eben 
keine Probleme.

Ich werd jetzt mal schauen, ob ich da iwie ein "unmanaged" projekt finde 
und das versuchen dann da einzubinden.

Ansonsten werde ich mir vll. mal Qt 4 anschauen. Ich hab allerdings auch 
nicht mehr ganz soviel Zeit ;)

Vll. kann sich noch jmd. anders an meinem Projekt versuchen :( Das wäre 
nett.

Grüße Tom

von Tom A. (thomas_a)


Lesenswert?

Ist Qt auch für den kommerziellen Betrieb frei?
Das ist wohl für mich noch eine entscheidende Frage ;)

von Markus V. (Gast)


Lesenswert?

Ich sehe schon, Du hast mit .net noch nicht viel Erfahrung. "managed" 
ist alles, was zur Laufzeit die .net Common Language Runtime (CLR) 
benötigt. Als "unmanaged" werden die Umgebungen bezeichnet, die "native" 
laufen, also OHNE CLR auskommen.

Es ist auch kein Problem, managed (C#, VB.NET, managed C++, F#) zu 
mischen. Allerdings muß das auf eine bestimmte Art und Weise erfolgen. 
Das Stichwort hierzu ist P/Invoke. Dort werden die CLR-Datentypen per 
Marshalling so gewandelt, das beide Welten miteinander können.

Wenn Du bislang keine Erfahrung mit Oberflächen hast, wäre ein guter 
Einstieg in die MS-Welt z.B. Windows Forms (.net) oder auch Windows 
Presentation Foundation (WPF, ebenfalls .net und etwas moderner). Von 
Deiner GUI aus sprichts Du dann Deine unmanaged Lib(s) über P/Invoke an. 
Das hört sich jetzt alles recht kompliziert an, ist es aber nicht 
wirklich. MS hat da recht gute Arbeit geleistet (ich komme von C/C++ und 
Java). Ich würde allerdings vorher mal schauen, ob es da nicht eine 
Lib/DLL für .net gibt (wird dann Assembly genannt). Das erleichtert das 
Leben ungemein.

Ach ja, wenn Du C++ kannst, dann lasse die Finger von managed C++. Wenn 
Du C++ nicht so gut kannst, dann sowieso. ;-) Die Sprache der Wahl in 
der .net-Welt ist C#. Damit hast Du alle Möglichkeiten die die CLR 
bietet.

Gruß
Markus

von Tom A. (thomas_a)


Lesenswert?

Ok, dann werde ich mich da jetzt mal dran machen ;)

Kann ja nicht so schwer sein ;)

Vielen Dank nochmal für die Infos ;)

Grüße Tom

von Rolf M. (rmagnus)


Lesenswert?

Tom A. schrieb:
> Ist Qt auch für den kommerziellen Betrieb frei?

Ob das Projekt kommerziell ist, ist schon immer egal gewesen. Dir geht 
es wohl eher darum, ob man es unter GPL veröffentlichen muß. Das muß man 
seit Qt 4.5 nicht mehr.

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
Noch kein Account? Hier anmelden.