Visual Studio, windows form ping app + textbox value

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Zijn we weer :)

Ben nu bezig wat te stoeien met windows forms applications.

- wat ik wil.
- wat ik heb.
- wat nog niet werkt.

Ik wil een klein window met 1 textbox en 2 buttons.
button1: exit
button2: ping
textbox: url of ip om te pingen

Wat ik heb:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 Application::Exit();
             }
    
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
                 
                // String^ result = textBox1->Text;
                 //MessageBox::Show( result );
                 
                 system("ping -n 2 www.google.nl > C:\\pingtest.txt");
             }
    private: System::Void textBox1_TextChanged(System::Object^  sender, System::EventArgs^  e) {
             
             }


Bovenstaande werkt gewoon met de hardcoded ping call

Volgende werkt niet:
C++:
1
2
3
4
5
6
7
8
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
                 
                String^ result = textBox1->Text;
                //MessageBox::Show( result ); 
                system("ping -n 2 " + result +  " > C:\\pingtest.txt");
             }
// ERROR: error C2664: 'system' : cannot convert parameter 1 from 'System::String ^' to 'const char *
// moet dus de waarde van textBox1 om zien te zetten zodat ik hem kan gebruiken met de button call ping


( wanneer ik ping even comment en de messagebox uncomment, zie ik gewoon keurig de value van de textbox in een extra popup verschijnen.)


Iemand een idee, ben nog niet echt bekend met windows forms en (? .NET) etc.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dit heeft niks met .NET of WinForms te maken. Je weet, zeker als gebruiker van de C-familie, toch wel wat (type)casten is?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
NMe schreef op donderdag 28 juni 2012 @ 10:36:
Dit heeft niks met .NET of WinForms te maken. Je weet, zeker als gebruiker van de C-familie, toch wel wat (type)casten is?
gebruiker van, ja in zoverre, heb wat tooltjes gemaakt, maar die waren redelijk simpel, nog niet echt met conversoin of type casting te maken gehad.

simpele conversion als:

short a=2000;
int b;
b=a;

net gevonden, maar dit gaat bij mij niet werken. Zal dus iets meer info moeten zoeken over het omzetten van String^ naar ....

[ Voor 19% gewijzigd door MarcHeijerman op 28-06-2012 10:45 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan moet je daar maar eens op Googlen. Heb je dat überhaupt al gedaan? Als ik je foutmelding in Google stop vind ik vrijwel alleen maar uitleg over typecasting en andere typeconversies.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
ok bedankt

Acties:
  • 0 Henk 'm!

Verwijderd

C++:
1
    char* result = (char*)(void*)Marshal::StringToHGlobalAnsi(textBox1->Text);


Vergeet niet om de namespace erbij te halen anders werkt het niet!

C++:
1
    using namespace System::Runtime::InteropServices;

Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Verwijderd schreef op donderdag 28 juni 2012 @ 10:54:
C++:
1
    char* result = (char*)(void*)Marhal::StringToHGlobalAnsi(textBox1->Text);


Vergeet niet om de namespace erbij te halen anders werkt het niet!

C++:
1
    using namespace System::Runtime::InteropServices;
Heb hem even snel geprobeerd:

error C2653: 'Marhal' : is not a class or namespace name
error C3861: 'StringToHGlobalAnsi': identifier not found

Ik ga wel even zoeken waarom dit gebeurd, using namespace is included.

lol, was een typo, het is marshal ipv marhal

[ Voor 3% gewijzigd door MarcHeijerman op 28-06-2012 11:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

misschien een stomme vraag maar heb je de using namespace wel boven aan staan bij de rest en niet onder het eerste stukje code, want anders zal dat wel de fout zijn?

EDIT:
Ik zag dat je het al had gevonden! =D

[ Voor 12% gewijzigd door Verwijderd op 28-06-2012 11:05 ]


Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Verwijderd schreef op donderdag 28 juni 2012 @ 11:04:
misschien een stomme vraag maar heb je de using namespace wel boven aan staan bij de rest en niet onder het eerste stukje code, want anders zal dat wel de fout zijn?
Zet het altijd bovenaan na de includes

Acties:
  • 0 Henk 'm!

  • Arjen42
  • Registratie: September 2010
  • Laatst online: 09-09 08:17
Probeer eens met String.Format (of sprintf) je commando in elkaar te zetten. Bijvoorbeeld zo:

C++:
1
string commando = String.Format("ping -n 2 {0} > C:\\pingtest.txt", result);


C++:
1
sprintf(commando, "ping -n 2 %s > C:\\pingtest.txt", result);


Ik zou echter als je niet zo veel affiniteit met pointers e.d. hebt overstappen op C#. Dit werkt een stuk plezieriger dan C++. Zeker als je toch met managed code werkt, maakt het voor het eind resultaat niks. Zelf programmeer ik zelf het meest in C# in gebruik ik C++ alleen voor unmanaged code als direct de win32 api wil gebruiken. (Hoewel je met een truukje ook vrij eenvoudig de win32 api kan aanroepen.)

Overigens zie ik dat je de uitvoer van het ping commando naar een file wild sturen. Ik neem aan dat die daarna gelijk wilt inlezen? Dan kan je beter direct de standard output (en error) omleiden naar een stream waardoor je zonder een tmp file de uitvoer kunt gebruiken. Je kan dan ook gelijk de uitvoeren tonen in je programma terwijl het programma nog draait. Hiervoor heb je de system.diagnostics.processstartinfo class nodig. Kijk Als je dat graag wilt kan ik hier een voorbeeld van posten.

Veel succes

[ Voor 6% gewijzigd door Arjen42 op 30-06-2012 18:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

C++:
1
string commando = sprintf("ping -n 2 %s > C:\\pingtest.txt", result);
Ik ben wat dat betreft een absolute naab op het gebied van C++ maar sprintf retourneert een int, dus gaat niet werken zo ben ik bang.

Ik las ook dat sprintf onveilig zou zijn i.v.m. buffer overflows, en is vervangen door sprintf_s tenminste in Visual Studio wordt dit aangegeven.
Dit zou moeten werken:
C++:
1
2
3
char commando[255];
sprintf_s(commando, 255, "ping -n 2 %s > c:\\pingtest.txt", result);
system(commando);

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
NMe schreef op donderdag 28 juni 2012 @ 10:36:
Dit heeft niks met .NET of WinForms te maken. Je weet, zeker als gebruiker van de C-familie, toch wel wat (type)casten is?
[mierenneukmodus]
Dit heeft toch juist wel met .NET te maken, hij gebruikt C++/CLI en wil een CLI (AKA .NET) String type omzetten naar een cstr const char *
[/]
Verwijderd schreef op zaterdag 30 juni 2012 @ 19:09:
[...]

Ik ben wat dat betreft een absolute naab op het gebied van C++ maar sprintf retourneert een int, dus gaat niet werken zo ben ik bang.

Ik las ook dat sprintf onveilig zou zijn i.v.m. buffer overflows, en is vervangen door sprintf_s tenminste in Visual Studio wordt dit aangegeven.
Dit zou moeten werken:
C++:
1
2
3
char commando[255];
sprintf_s(commando, 255, "ping -n 2 %s > c:\\pingtest.txt", result);
system(commando);
Je kunt sprintf_s gebruiken maar dan moet je er wel rekening mee houden dat je non-standard C++ gebruikt en dan alleen kunt compilen met de VC++ compiler. Nu is dit meestal geen probleem maar dan snap je waar sprintf_s vandaan komt. In het geval van de TS met C++/CLI is dit al het geval maar het leek me goed om er bij te zetten waarom sprint_s niet altijd kan.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

Verwijderd

Dat is wel lekker inderdaad dat sprintf_s niet portable is, zou je dat kunnen oplossen met #ifndef #define wanneer je bijvoorbeeld de Linux variant wilt gebruiken?

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Verwijderd schreef op zaterdag 30 juni 2012 @ 20:01:
Dat is wel lekker inderdaad dat sprintf_s niet portable is, zou je dat kunnen oplossen met #ifndef #define wanneer je bijvoorbeeld de Linux variant wilt gebruiken?
Tuurlijk

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

Verwijderd

Dan begin ik het idee een beetje beter te begrijpen, aangezien ik nog niet heel erg veel kennis bezit in C++

Acties:
  • 0 Henk 'm!

  • Arjen42
  • Registratie: September 2010
  • Laatst online: 09-09 08:17
@Mostrow [19:09], dat klopt allebei wat je zegt.

Het eerste had al aangepast, toen ik me dat realiseerde.

Het tweede leek me niet echt kritiek gezien de toepassing. Aangezien het een .net app is heeft de String.Format method i.c.m. een string variabele de voorkeur.

Portabiliteit lijkt me ook niet zo'n issue aangezien de rest van het programma dat ook niet is.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Verwijderd schreef op zaterdag 30 juni 2012 @ 20:01:
Dat is wel lekker inderdaad dat sprintf_s niet portable is, zou je dat kunnen oplossen met #ifndef #define wanneer je bijvoorbeeld de Linux variant wilt gebruiken?
snprintf is de C99 functie die daarvoor bedoeld is (en die niet door de VC++ compiler wordt ondersteund) maar aangezien deze ook onderdeel is van de C++11 standaard zou hij vroeg of laat moeten opduiken bij MS.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

roy-t schreef op zaterdag 30 juni 2012 @ 19:21:
[...]


[mierenneukmodus]
Dit heeft toch juist wel met .NET te maken, hij gebruikt C++/CLI en wil een CLI (AKA .NET) String type omzetten naar een cstr const char *
[/]
Het ging me meer om het zien en herkennen van de foutmelding en op basis daarvan weten waar je op moet zoeken. ;) Het probleem was hier niet dat de TS niet weet hoe hij een type moet omzetten van een C++/CLI string naar een C-string, maar dat de TS blijkbaar überhaupt niet wist wat casten is. En dat vind ik vrij kwalijk voor iemand die met de C-familie bezig is. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
NMe schreef op zondag 01 juli 2012 @ 12:45:
[...]

Het ging me meer om het zien en herkennen van de foutmelding en op basis daarvan weten waar je op moet zoeken. ;) Het probleem was hier niet dat de TS niet weet hoe hij een type moet omzetten van een C++/CLI string naar een C-string, maar dat de TS blijkbaar überhaupt niet wist wat casten is. En dat vind ik vrij kwalijk voor iemand die met de C-familie bezig is. ;)
Jup vrij kwalijk toch, of ehm ow wacht mensen leren telkens weer bij, is dat ook kwalijk, ik vind het nogal kwalijk dat jij als "mod" dat soort uitspraken doet.

Modereer gewoon en ga niet uithalen naar leden die nog niet net zoals jij blijkbaar wel alles weten.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je kán het natuurlijk ook op de slechtst mogelijke manier opvatten. Ik bedoelde eigenlijk dat whatever de leermethode is die je gebruikt waarschijnlijk niet zo goed is als die typecasting niet behandelt. Pas als die leermethode dat wel netjes doet en jij dat onderdeel geskipt hebt kun je die post opvatten zoals je nu gedaan hebt.

Verder heb ik net als ieder ander het recht om normaal mee te posten. Als ik niet specifiek aangeef dat ik vanuit mijn functie spreek, dan spreek ik op persoonlijke titel. Geloof het of niet, maar ik heb ook wel eens een mening.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
NMe schreef op dinsdag 03 juli 2012 @ 11:01:
Je kán het natuurlijk ook op de slechtst mogelijke manier opvatten. Ik bedoelde eigenlijk dat whatever de leermethode is die je gebruikt waarschijnlijk niet zo goed is als die typecasting niet behandelt. Pas als die leermethode dat wel netjes doet en jij dat onderdeel geskipt hebt kun je die post opvatten zoals je nu gedaan hebt.

Verder heb ik net als ieder ander het recht om normaal mee te posten. Als ik niet specifiek aangeef dat ik vanuit mijn functie spreek, dan spreek ik op persoonlijke titel. Geloof het of niet, maar ik heb ook wel eens een mening.
De leer methode bestaat alleen uit google. Dus wanneer jij met casting aankomt, dan google ik dat dus weer op. Dit is de manier van leren. Ik vind dat je dat soort dingen ook normaal kan melden. Iedereen heeft meningen, maar ik denk dat de mening van een "mod" mischien iets anders kan worden geformuleerd niet ?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zit hier niet om vrienden te maken, ik zit hier om mensen te helpen. Soms mag je daar best bot voor zijn.

In jouw geval: misschien is het een goed idee om een echte leermethode erbij te pakken? Of dat nu een tutorial is die je in zijn geheel doorwerkt of een goed boek maakt daarbij niet uit, maar nu zitten er gewoon gaten in je kennis. Lijkt me zonde.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Volgens mij wil je pingen vanuit je .NET applicatie, dat kan ook met .NET zelf:

http://msdn.microsoft.com...em.net.networkinformation

http://msdn.microsoft.com/en-us/library/a63bsyf0

En als je toch de 'system()' functie wilt gebruiken dan kan dat ook op een .net manier:
http://msdn.microsoft.com/en-us/library/h6ak8zt5.aspx

[ Voor 25% gewijzigd door epic007 op 03-07-2012 13:20 ]


Acties:
  • 0 Henk 'm!

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
epic007 schreef op dinsdag 03 juli 2012 @ 13:18:
Volgens mij wil je pingen vanuit je .NET applicatie, dat kan ook met .NET zelf:

http://msdn.microsoft.com...em.net.networkinformation

http://msdn.microsoft.com/en-us/library/a63bsyf0

En als je toch de 'system()' functie wilt gebruiken dan kan dat ook op een .net manier:
http://msdn.microsoft.com/en-us/library/h6ak8zt5.aspx
Bedankt voor de info !
Pagina: 1