visual studio expres c++ 2012 #define build.h dynamisch vergeben
-
Hallo ersmal an alle
Habe ein problem mit meine build.h
Und zwahr soll per WebClient die neue Build Nummer
Ubergeben werden.Das klappt aber nicht
build.h
#pragma once using namespace System; using namespace System::Net; 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; } #if !defined(build) #define build L"{0}",getbuild #endif
Form1.h
#include "build.h" #include "version.h" this->Text = String::Format(L"Version: {0} Build:{1}",version,build);
Fehler meldung:
error C2665: "System::String::Format": Durch keine der 5 Überladungen konnten alle Argumenttypen konvertiert werden. c:\users\seby\desktop\kopie mein\tool\Form2.h 64438 IntelliSense: Keine Instanz von Überladene Funktion "System::String::Format" stimmt mit der Argumentliste überein.
Argumenttypen sind: (const wchar_t [15], const wchar_t [16], const wchar_t [4], System::String ^()) c:\users\seby\desktop\kopie mein\tool\Form2.h 6443 19Bitte um hilfe
-
Hi,
du bist im falschen Forum. Das ist CLI. Jemand wird dich verschieben
-
Das ist wieder einmal ein einziges grosses Chaos...
Zitierte Fehlermeldung sagt dass der Fehler in Form2.h ist - du zeigst Code von Form1.h (schreibst du jedenfalls drüber). Also: falscher Code oder falsche Überschrift?
Auch kann der gezeigte Code von Form1.h nicht so vorkommen - ist
this
im Spiel, ist auch eine Klasse im Spiel.Zeige doch einfach mal ein minimal Beispiel, das sich kompilieren und ausführen lässt - eine kleine Konsolenanwendung in einem File genügt. Vermutlich kommst du beim machen der Beispiels sogar von selbst auf die Lösung.
Edit:
Das es sich bei dem Code um C++/CLI und nicht C++ handelt wurde ja schon genannt.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
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