visual studio expres c++ 2012 #define build.h dynamisch vergeben
-
Hallo erstmal entschuldige wegen falsche forum, ich kenne den unterschied zwischen c++ und c++/cli nicht.
Zu fehler meldung,
richtig ist es Form2.h wie auf dem fehler zu sehen.
Auch kann der gezeigte Code von Form1.h nicht so vorkommen - ist this im Spiel, ist auch eine Klasse im Spiel.
Die klasse mienst du mit ?
public ref class Form2 : public System::Windows::Forms::Form
Das ist ja nicht mein problem..
Mein problem ist wenn ich
#if !defined(build) #define build L"Build Nummer" #endif
Mache gehts ohne probleme...
Dann gibt Form2
this->Text = String::Format(L"Version: {0} Build:{1}",version,build);
Die Version und Build Nummer aus die definiert wurde.
Sobald ich die nummer aber versuche dynamisch zu laden
Soll die datei auf dem server auslesen index.php?get=build (Klappt)
String ^getbuild() { String ^result = gcnew String(L""); try { WebClient ^wc = gcnew WebClient(); result = wc->DownloadString(L"http://meinserver.net/build/index.php?get=build"); } catch(WebException ^) { } return result; }
Soll die geladene datei Definieren, damit diese später geladen werden kann
z.b in Form2
Später auch in Form1 Und Form3#if !defined(build) #define build L"{0}",getbuild #endif
Spuckt mir in diesem fall Form2 die fehler meldung aus.
in Form2#include "build.h"
-
Lösung:
#if !defined(build) #define build getbuild() #endif
Aber warum verwendest du überhaupt Makros?
Einfacher wäre doch gleich
this->Text = String::Format(L"Version: {0} Build:{1}", version, getbuild());
PS: Daß du durch den Web-Zugriff u.U. deine GUI blockierst, sollte dir aber klar sein. Besser wäre es, wenn du den Wert asynchroon laden würdest (aber das scheint wohl bei deinem jetzigen Kenntnisstand noch zu hoch zu sein).
-
seby1302 schrieb:
ich kenne den unterschied zwischen c++ und c++/cli nicht.
C++/CLI ist eine spezielle Programmiersprache die zwar an C++ angelehnt ist, aber auch Unterschiede aufweist, z.B. die Möglichkeit das .Net-Framework zu verwenden.
Aber: Windows Forms und Visual C++ MACHT KEINEN SINN!
Und du verwendest hier Windows Forms, solltest dir den verlinkten Thread daher vielleicht einmal ansehen. Falls du dich privat einarbeitest: Lass es lieber und nutze andere Sprachen (sei es z.B. natives C++ oder C# - letzteres für das .Net-Framework).
-
TH69
Danke aberGennau das hatte ich schonmal versucht..
Fehlermeldung:
Fehler 1 error LNK2005: "class System::String ^ __clrcall getbuild(void)" (?getbuild@@$$FYMP$AAVString@System@@XZ) ist bereits in Form2.obj definiert. c:\users\seby\desktop\kopie mein\tool.obj tool
und danke auch an asc
-
Dir scheinen die grundlegendsten Kenntnisse zu fehlen:
eine Funktion darf nur einmalig definiert werden (die sog. One defintion rule (ODR)) - also deklariere sie nur im Header und implementiere sie in einer Sourcedatei!
-
Hallo
TH69 Das mit dem einmalig definieren, ist mir schon bewust..
Und ich habe mich von den fehlern irre führen lassen, eig. hatte ich das schon richtig gehabt Und habe dan noch mehr fehler eingebaut.
Das problem ist volgendes...
getbuild() ist nur 1x definiert (in build.h)
leider spuckt der mir jetzt jedes mal diese fehler aus.
Da in Form2.h
#include "build.h" gibts....Wen ich build.h weg lasse und.
String ^getbuild() { String ^result = gcnew String(L""); try { WebClient ^wc = gcnew WebClient(); result = wc->DownloadString(L"http://meinserver.net/build/index.php?get=build"); } catch(WebException ^) { } return result; }
Direckt im Form2.h packe läufts ja.
Nur soll ich überall immer den selben code rein schreiben?
z.b Form1.h Form2.h Form2.h etc..?
-
getbuild() ist nur 1x definiert (in build.h)
Normalerweise macht man das wie folgt:
- im Header-File die Funktion deklarieren
- im Source-File die Funktion definierenbuild.h
String ^getbuild();
build.cpp
#include "build.h" String ^getbuild() { // ... }
Edit:
So wie du es gemacht hast (in build.h definiert), gibt es in jeder Übersetzungseinheit eine Definition - was bei mehreren Übersetzungseinheiten dann mehrere Definitionen zur Folge hat.Edit #2:
Obengezeigte Lösung ist nur eine von mehreren Lösungen - es gibt noch andere Möglichkeiten.
-
Hallo funzionert so nicht...
build.h
String ^getbuild();
build.ccp
#include "stdafx.h" //#include "build.h" *String ^getbuild()* da meckert der macht der rot... using namespace System; using namespace System::Net; String ^getbuild() { String ^result = gcnew String(L""); try { WebClient ^wc = gcnew WebClient(); result = wc->DownloadString(L"http://localhost/index.php?get=build"); } catch(WebException ^) { } return result; }
Amsonsten ohne include build.h in build.cpp ist build.ccp ok
Jedoch spuckt form1.h form2.h fehler aus
Fehler 1 error C3861: "getbuild": Bezeichner wurde nicht gefunden.
-
Wie ich schon schrieb: dir fehlen die grundlegendsten Kenntnisse.
Und dann solltest du kein C++/CLI programmieren (denn hierfür muß man sowohl C++ als auch .NET-Kenntnisse haben)!Verwende also entweder nur natives C++ oder C# (mit .NET)!
Ich werde dir daher die einfache Lösung nicht hinschreiben.
-
Hatt sich erledigt, alles ist so geblieben wie es wahr und das
form1.h
#include build.h
its works