VC++ zeiger addition

Hallo Leute,
ich hab hier n Problem auf dessen Lösung ich nicht komme...
Hab schon ganz Google und sämtliche Foren abgegrast, aber nirgends gibts was das mir weiterhilft.

-VC++ 2005-
Also es geht um folgendes: Ich lese über die "IP Address Control" eine IP ein (wird als DWORD gespeichert) und möchte diese in einen net use Aufruf mit einfügen um ein Netzlaufwerk zu verbinden. Dieser Aufruf befindet sich in einer Create Process Struktur, da unbedingt das Ende des (nicht/ erfolgreichen) Verbindungsaufbau abgewartet werden muss. Wenn ich jetzt aber eben diese IP Variable einfügen will bekomme ich nur "zwei Zeiger können nicht addiert werden" ?!?!
Hab schon allemöglichen casts etc. probiert, aber nichts will funktionieren, kann mir einer von euch helfen :)

Code:
...

	if(!CreateProcess(NULL, TEXT("net use z: \\\\"+clientIP+"\\test blabla /user:User@SERVER"), NULL,
				NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &SUInfo, &PInfo))
	{
		statusMsg="Can´t Connect To Networkshare";
		UpdateData(FALSE);
	}

	WaitForSingleObject(PInfo.hProcess,INFINITE);
	CloseHandle(PInfo.hThread);

...

Es handelt sich um die Variable "clientIP".
 
Sehe ich das richtig, dass clientIP ein char* ist? Falls clientIP noch das DWORD ist, musst du zuerst die Adresse als DWORD in eine Zeichenkette umwandeln.(sprintf)
Falls ja: Du kannst in C++ normale Zeichenketten nicht einfach per + addieren. Entweder du verwendest Funktionen wie sprintf oder du verwendest die Klasse string.

Möglichkeit 1:
Code:
char *ipString = ....;
char buffer[256]; //Länge so anpassen, dass kein Stack-Overflow möglich ist
sprintf(buffer,"net use z: \\\\%s\\test blabla /user:User@SERVER",ipString);
CreateProcess(NULL,buffer,...)

Möglichkeit 2:
Code:
#include <string>
...
char *ipString = ...;
std::string command = "net use z: \\\\"+string(ipString)+"\\test blabla /user:User@SERVER";
..
CreateProcess(NULL,command.c_str(),....

Wenn du bei Möglichkeit 1, ohnehin noch das DWORD per sprintf umwandeln muss, geht das natürlich auch in einem Schritt.
 
wow Danke für die schnelle Antwort!!!
So haut es jetzt auch hin, allerdings speichert er mir in meine clientIP Variable irgendwas und nicht meine angegebene IP - 192.168.40.102 --> 3232245862 (k.a. warum er das macht). Werde jetzt einfach die IP Address Control durch ein einfaches Textfeld ersetzen, dann gibts keine Scherereien ;)

Und um nicht noch nen 2ten Thread aufmachen zu müssen, stell ich hier gleich noch ne Frage:
Ich will in einem weiteren CreateProcess Aufruf
- einen FileCopy anstoßen
- warten bis das Kopieren beendet ist
- und dann weiterarbeiten lassen.
Grund dafür ist, dass ich die Kopierzeit über einen Timer mitstoppen muss.

Ich habe bis jetzt 3 Möglichkeiten gefunden um diesen Kopiervorgang zu starten:
FileCopy(Quelle, Ziel, TRUE|FALSE) -> da macht er gar nix, auch net außerhalb vom CreateProcess

dann noch das hier
Code:
STARTUPINFO SUInfo={0};
PROCESS_INFORMATION PInfo={0};
ZeroMemory( &SUInfo, sizeof( SUInfo ));
SUInfo.cb=sizeof( SUInfo );	
SHFileOperation(&shFile)
das geht, aber sobald ichs in den CreateProcess packe, macht er wieder nix, bzw bringt Fehler:
Code:
	if(!CreateProcess(SHFileOperation(&shFile),NULL, NULL,NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &SUInfo, &PInfo))
	{
		statusMsg="Can´t Copy Files";
		UpdateData(FALSE);
	}

So und nun noch meine letzte Möglichkeit, mit nem ganz einfachen copy Aufruf:
Code:
if(!CreateProcess(NULL, TEXT("copy C:\\....  Z:\...."), NULL,
				NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &SUInfo, &PInfo))
	{
		statusMsg="error";
		UpdateData(FALSE);
	}
da springt er mir aber sofort in die Abfrage und gibt error aus....


Ich hoffe das war jetzt nicht zu viel auf einmal und vielleicht kann mir ja nochmal jemand helfen
 
Zu der IP-Schreibweise: Jedes Byte des DWORDs ist eine Zahl der IP:
3232245862 = 0xC0A82866

0xC0 = 192
0xA8 = 168
usw..

Mit Bitverschiebungen und binärem Und kannst du das ganze dann auch mit sprintf o.ä. in die "normale" Schreibweise umwandeln.

Überprüfe mal die Rückgabe von GetLastError() nach dem Aufruf von CopyFile um zu sehen, was falsch läuft. FileCopy kenne ich so jetzt nicht, sieht mir aber nach einer VB-Funktion aus und daher ungeeignet.
 
8o umpf - danke für die Erklärung, mal schauen ob ich die Umwandlung hinbekomme (gibts da keine "einfache" Cast möglichkeit??) bzw. vielleicht könntest mir ja noch erklären wie ich das mit der Verschiebung und so mache :rolleyes:

So und bei GetLastError bekomme ich eine 2 zurück, was auch immer das jetzt zu bedeuten hat (finde die Errorliste leider nicht) Ach ja und du hast recht, ich habe mich verschrieben gehabt, hatte natürlich schon die CopyFile Funktion verwendet....

Unabhängig davon müsste das vom Prinzip her doch klappen was ich da vor habe oder? Also den copy in nen eigenen Prozess packen und für den die Zeit stoppen?!

Vielen Dank

//EDIT: so die CopyFile funktioniert jetzt, die Funktion arbeitet wohl nur korrekt, wenn die angegebenen Verzeichnisse existieren (werds gleich auch mal mit dem benötigten netzlaufwerk testen)
//EDIT2: geht auch, bleibt also nur noch das dingens mit dem prozess (und evtl. IP)
 
Hier mal ein Beispiel, wie eine Umwandlung aussehen könnte:
Code:
DWORD ip; 
char addr[16];
memset(addr,0,16);
for(int i=0;i<4;i++) {
   sprintf(addr,"%s%i.",addr,((ip >> ((3-i)*8)) & 0xFF));
}
addr[strlen(addr)-1] = 0;
Danach hast du in addr die Adresse in normaler Notation. Dabei wird die Adresse jeweils um die richtige Anzahl an Bits verschoben(für's erste um 24, dann um 16, ...) und jeweils der Rest durch das &0xFF ignoriert.

Hier ist eine Liste mit den Fehlernummern: http://msdn2.microsoft.com/en-us/library/ms681382.aspx

ERROR_FILE_NOT_FOUND
2
D.h. er findet einfach die Datei nicht, die du kopieren willst(evtl. Argumente vertauscht?).
Unabhängig davon müsste das vom Prinzip her doch klappen was ich da vor habe oder? Also den copy in nen eigenen Prozess packen und für den die Zeit stoppen?!
Mit einem neuen Prozess ginge es zwar auch, aber man sollte nicht CreateProcess verwenden, wenn es auch ohne geht, da es einen ziemlichen Overhead mit sich bringt und den Code unübersichtlicher macht, als nötig.
Mit CopyFile kannst du auch die Zeit stoppen, indem du einfach GetTickCount vorher und nachher aufrufst und subtrahierst. Das halte ich persönlich für einfacher als extra CreateProcess zu bemühen, obwohl es eine Funktion extra für's Kopieren schon gibt.
 
Also das heißt dass der Code solange bei CopyFile wartet bis der Kopiervorgang abgeschlossen ist ?!!? Dann wärs in der Tat zu viel noch nen CreateProcess zu starten.

OK, dann werd ich mal weitermachen und später oder morgen nochmal melden ob alles geklappt hat bzw ob Fehler auftreten....

Danke aufjedenfall schonmal für den Top Support deinerseits! :)


//Feedback:
Hab jetzt alles mit eingebaut und sonst noch n paar Sachen umgebaut. GetTickCount ist genau das was ich gesucht hatte, Danke!! Nachdem ich davor für sowas immer WinExec verwendet hatte, war ich der Meinung dass der Code direkt nach CopyFile weiterarbeitet (wie ers ja bei WinExec macht, da der Aufruf extern in ner cmd Abläuft (zumindest bei den Sachen wo ichs bisher verwendet hatte)) - und deshalb auch der Gedanke mit nem eigenen Prozess via CreateProcess...

bis zur nächsten frage dann :P
so long, sx
 
Zurück
Oben