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??


  • Mod

    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 🕶 😋


Anmelden zum Antworten