Code umschreiben...
-
Hallo Leute ich hab folgenden Code gefunden:
AnsiString ExecuteExternalFile(AnsiString FEXEC) { AnsiString OUTP; char BUFFER[100],InAnsi[100]; unsigned long LPDWORD; SECURITY_ATTRIBUTES secattr; ZeroMemory(&secattr,sizeof(secattr)); secattr.nLength = sizeof(secattr); secattr.bInheritHandle = TRUE; HANDLE rPipe, wPipe; // Pipe für lesen und schreiben CreatePipe(&rPipe,&wPipe,&secattr,0); // Für CreateProcess STARTUPINFO sInfo; ZeroMemory(&sInfo,sizeof(sInfo)); PROCESS_INFORMATION pInfo; ZeroMemory(&pInfo,sizeof(pInfo)); sInfo.cb=sizeof(sInfo); sInfo.dwFlags=STARTF_USESTDHANDLES; sInfo.hStdInput=NULL; sInfo.hStdOutput=wPipe; sInfo.hStdError=wPipe; // Ausführen CreateProcess(0, FEXEC.c_str(), 0, 0, TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, 0, 0, &sInfo,&pInfo); CloseHandle(wPipe); // Rückgabe auslesen while(ReadFile(rPipe,BUFFER,100,&LPDWORD,0)) { BUFFER[LPDWORD]=NULL; OemToChar(BUFFER,InAnsi); OUTP+=InAnsi; } return OUTP.TrimRight(); // Löscht nachfolgende Leer- und Steuerzeichen }Doch dieser Code ist aber für den Borland Compiler, aber ich möchte gern den Code mit VC8 kompilieren, könnt ihr mir bitte Code diesen umschreiben das wäre nett.
-
ersetze AnsiString durch std::string...
-
Bekomme dann 2 Fehler:
error C2664: 'CreateProcessA': Konvertierung des Parameters 2 von 'const char *' in 'LPSTR' nicht möglich
error C2039: 'TrimRight': Ist kein Element von 'std::basic_string<_Elem,_Traits,_Ax>'
-
kernel64 schrieb:
Bekomme dann 2 Fehler:
error C2664: 'CreateProcessA': Konvertierung des Parameters 2 von 'const char *' in 'LPSTR' nicht möglich
error C2039: 'TrimRight': Ist kein Element von 'std::basic_string<_Elem,_Traits,_Ax>'Zum ersten Fehler: Fahr dir mal ein paar Sachen übers Casten rein. "const char*" und "LPSTR" sind (fast) dasselbe. Auf jeden Fall beides Pointer auf einen String. Ein String vom Typ "const char*" soll nicht verändert werden, deshalb const wie konstant. LPSTR ist ein anderes "Wort" für "char*". Also ohne das const, also darf verändert werden. Aber was erzähl ich dir was über konstante Typen? Tutorials, Junge!
Zum zweiten Fehler:
Mit der Funktion TrimRight werden glaube ich die nachfolgenden Leerzeichen abgeschnitten. "Hallo " wird also zu "Hallo". Kannste dir ja selber mal ne Funktion für programmieren... Lernt man von...
-
Badestrand schrieb:
Zum zweiten Fehler:
Mit der Funktion TrimRight werden glaube ich die nachfolgenden Leerzeichen abgeschnitten. "Hallo " wird also zu "Hallo".Jo siehe hier: http://www.functionx.com/bcb/topics/strings.htm
EDIT: @kernel64: Vllt. ist auch ShellExecute interessant
.
-
Diesen Code kann man kompilieren und erstellen:
string ExecuteExternalFile(string FEXEC) { string OUTP; char BUFFER[100],InAnsi[100]; unsigned long LPDWORD; SECURITY_ATTRIBUTES secattr; ZeroMemory(&secattr,sizeof(secattr)); secattr.nLength = sizeof(secattr); secattr.bInheritHandle = TRUE; HANDLE rPipe, wPipe; // Pipe für lesen und schreiben CreatePipe(&rPipe,&wPipe,&secattr,0); // Für CreateProcess STARTUPINFO sInfo; ZeroMemory(&sInfo,sizeof(sInfo)); PROCESS_INFORMATION pInfo; ZeroMemory(&pInfo,sizeof(pInfo)); sInfo.cb=sizeof(sInfo); sInfo.dwFlags=STARTF_USESTDHANDLES; sInfo.hStdInput=NULL; sInfo.hStdOutput=wPipe; sInfo.hStdError=wPipe; // Ausführen CreateProcess(0, cvt.StringToChar(FEXEC), 0, 0, TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, 0, 0, &sInfo,&pInfo); CloseHandle(wPipe); // Rückgabe auslesen while(ReadFile(rPipe,BUFFER,100,&LPDWORD,0)) { BUFFER[LPDWORD]=NULL; OemToChar(BUFFER,InAnsi); OUTP+=InAnsi; } return OUTP; // Löscht nachfolgende Leer- und Steuerzeichen }Doch sobald ich ein programm angebe welches auch um gleichen ordner befindet, dann bekomme ich eine Fehlermeldung:
Debug Error - Stack around the variable 'BUFFER' was corrupted
Liegt das vielleicht an der OemToChar() Funktion??
-
BUFFER[LPDWORD]=NULL;
Du liest 100 Zeichen. D.h. BUFFER ist voll und auf das 101 Zeiochen setzt Du eine 0 mit dem obigen Statement. Die CRT hat mit dieser Meldung absolut recht!
-
Soll ich die Zeile löschen oder was soll ich machen??
-
kernel64 schrieb:
Soll ich die Zeile löschen oder was soll ich machen??
Damit ist keinem geholfen: Du solltest viel lieber das 'NULL' mit in deine Berechnungen für die größe von Buffer miteinbeziehen, also brauchst du 101 einträge in Buffer
