.bat startet nicht



  • hallo erst mal alle mit einander

    ich habe einen dialog wo ich einen pfad abfrage und diesen in eine .bat datei schreiben lasse, dies funktioniert auch sehr gut, nur läst sich die .bat deitei nicht starten. die abfrage, das schreiben und das starten passiert mit einem button.

    codesampel:

    void Waehlen::OnOK()
    {
    UpdateData(true);
    CFile cf;
    if (cf.Open( "DEV.bat", CFile::modeWrite ) )
    {
    char szData[255];
    strcpy((char*)szData, m_pfad);
    try
    {
    cf.SeekToBegin();
    cf.Write( szData, strlen( szData ) );
    }
    catch( CFileException *e )
    {
    e->Delete();
    }
    }
    ::ShellExecute(m_hWnd,"open", "DEV.bat", 0, 0, SW_SHOWNORMAL );
    CDialog::OnOK();
    }

    hoffe mir kann jemand helfen...



  • Sollte man die Datei vor dem Ausführen nicht schliessen?



  • guter gedanke....
    ....und wie???

    [ Dieser Beitrag wurde am 07.07.2003 um 11:20 Uhr von Ghetto-Goffy editiert. ]



  • wenn ich:

    ::ShellExecute(m_hWnd,"open", "DEV_quake.bat", 0, 0, SW_SHOWNORMAL );
    CDialog::OnOK();

    auf einen anderen button lege, geht es doch.



  • Close ?



  • dann ist ja die datei auch schon geschlossen



  • Da stellt sich mal wieder die Frage wie lange eine Locale Variable oder Klasseninstanz gültig ist und ob CFile im Destructor close aufruft.
    😉



  • im dialog gibt es zwei botton´s, ok und abrechen, und eine eingabefeld. man fühlt das eingabefeld aus und drückt ok, dann werden die informationen aus dem eingabefeld in eine .bat geschrieben und die .bat gestartet. (siehe code am anfang.) die .bat start nicht. leg ich das starten der .bat auf den abbrechenbutton startet die .bat auch. warum???

    void Waehlen::OnOK()
    {
    UpdateData(true);
    CFile cf;
    if (cf.Open( "DEV_quake.bat", CFile::modeWrite ) )
    {
    char szData[255];
    strcpy((char*)szData, m_pfad);
    try
    {
    cf.SeekToBegin();
    cf.Write( szData, strlen( szData ) );
    }
    catch( CFileException *e )
    {
    e->Delete();
    }
    }
    ::ShellExecute(m_hWnd,"open", "DEV_quake.bat", 0, 0, SW_SHOWNORMAL );
    CDialog::OnOK();

    }

    void Waehlen::OnCancel()
    {
    ::ShellExecute(m_hWnd,"open", "DEV_quake.bat", 0, 0, SW_SHOWNORMAL );
    CDialog::OnCancel();
    }



  • Also fangen wir jetzt das Thema wohl nochmal von vorne an?



  • Schreib doch einfach in OnOK() vor ShellExecute(...);
    cf.Close();



  • nein, ich wollte nur das ihr einen koplett übersicht habt.
    erklär mir bitte "close", hab im MSDN nachgeguckt aber nicht´s gefunden was mir so auf dei schnelle weiter hilft.



  • Was gibt es da zu erklären.
    Wenn man eine Datei öffnet muss sie auch wieder geschlossen werden da Windows den Zugriff sperrt (Je nach Parametern bei open)

    CFile member close
    Beschreibung solltest du in der MSDN finden.



  • Ist doch eigentlich ganz einfach:

    Mit Open meldest Du beim Betriebssystem an, daß auf Du die Datei "Dev.bat" zugreifen möchtest und mit Close sagst Du daß Du die Operation abgeschlossen hast.



  • dank euch. funktioniert jetzt alles wie gewollt.
    hab cf.close(); vor ::ShellExecute aufgerufen.

    aber, warum funktioniert es mit dem abbrechbutton ohne das ich die datei schließe???



  • Ließ dazu bitte mal mein erstes Posting !



  • sorry, was soll das für eine antwort sein??? Antwortest du immer mit fragen???

    zitat:

    Da stellt sich mal wieder die Frage wie lange eine Locale Variable oder Klasseninstanz gültig ist und ob CFile im Destructor close aufruft.



  • OH MANO.

    Wenn du eine Locale Instanz von CFile erstellst ist diese nach dem verlassen der Funktion nicht mehr existent.
    Im Destuctor von CFile wir das File automatisch geschlossen.

    Das es nun geschlossen ist kannst du mit einer neuen Funktion wieder auf das File zugreifen.

    Ein paar Grundlagen würde ich dir schon empfehlen zum wissen.



  • dank dir, wieder was gelernt.

    sorry, das ich noch nicht der "c-gott" bin wie du, aber des wegen komme ich doch hier ins forum. ich weiß wenn ich hier poste bekommme ich schnelle und verständliche hilfe.



  • Ich bin nicht der c-Gott!

    Bevor man aber komplexe Sachen macht sollte man sich vorher die Grundlagen ansehen.
    Dies sind nicht komplexe oder erweiterte Grundlagen sondern unbedingt notwendige.
    Wie z.B wie definiere ich eine Klasse in einer Headerdatei.
    Dies ist auch nichts gegen dich persönlich sondern ein Ratschlag.



  • ich denke schon das ich die grundlagen von c++ kenne, wußte nur nicht das eine locale instanz einer klasse beim verlassen der funktion gelöscht werden.

    so denke wir sollten das thema an der stelle beenden.
    dank noch ma.



  • ich denke schon das ich die grundlagen von c++ kenne

    char szData[255];
    strcpy((char*)szData, m_pfad);
    try
    {
      cf.SeekToBegin();
      cf.Write( szData, strlen( szData ) );
    }
    

    Sorry, wenn wir dich aufgrund des obigen Codes zu den absoluten Anfängern zählen, aber wer sonst würde den Inhalt einer 1l-Flasche in einen Messbecher schütten, um rauszufinden, wieviel in die Flasche passt?


Anmelden zum Antworten