createprocess, kommandozeile, leerzeichen in der Pfadvariable



  • hi,

    mit createprocess starte ich eine Kommandozeilenanwendung.

    Anwendungsname + Parameter + Pfadnamen werden aus mehreren CStringvariablen zu einer CStringvariable formatiert, um diese an LpCommandline von createprocess zu übergeben.

    ungefähr so:

    CString sOptions("anwendung.exe -a -f" );
    CString m_sInput1 (Pfadname wird über CDialog zugewiesen)
    CString m_sOutput1 (Pfadname wird über CDialog zugewiesen)
    
    PgmInOut.Format("%s %s %s",sOptions,m_sInput1,m_sOutput1);
    

    Da createprocess lpcommandline nur LPTSTR nimmt habe ich den Cstring gecasted:
    (Falls jemand weiss wie es besser geht, nehm ich den tipp gerne an)
    [cpp]
    CreateProcess(
    NULL,
    (LPTSTR)(LPCTSTR)PgmInOut,
    NULL,
    NULL,
    TRUE,
    CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,
    NULL,
    NULL, &INFO, &PROCCINFO);
    [/cpp]
    Das funktioniert solange keine Leerzeichen im Pfad von m_sInput1 oder m_sOutput1 sind, da nun die kommandozeilenanwendung denkt, dass nach dem leerzeichen im Pfad eine neue option folgt.

    Hab schon mehrere Sachen ausprobiert:
    1. anwendung.exe übergeben an lpApplicationName der Rest an LptCommandline;
    2. m_sInput1.Format("\"%s\"",m_sInput1);
    3. PgmInOut.Format("\"%s\"",PgmInOut);
    ...

    hab aber schnell gemerkt, dass es kein Sinn hat noch extra Anführungszeichen dazuzupacken und mit createprocess kenne ich mich nicht wirklich gut aus.

    Kann mir jemand sagen wie ich das problem lösen kann?



  • Wie übergibst du denn sonst (über die Konsole) die Parameter?!



  • Gute Frage! Da liegt der Fehler..war zu sehr auf createprocess konzentriert um ihn zu sehen.

    Anwendung: wrap.exe
    option: -f
    inputfile: C:\Testfiles Input\file1
    outputfile: C:\Testfiles Output\file1

    In die Konsole muss ich eingeben:

    wrap -f C:\Testfi~1\file1 C:\Testfi~2\file2

    Weiss du ob es eine Funktion gibt die den Inhalt(C:\Testfiles Input\file1)
    einer CStringvariable in C:\Testfi~1\file1 konvertiert, damit die konsole was damit anfangen kann?

    randell



  • So kommen wir doch schonmal weiter: GetShortPathName 🙂



  • GetShortPathName hat insoweit funktioniert, dass in m_sShortInput1 der Pfad nun im richtigen Format abgelegt wird. Allerdings tritt dadurch ein anderes Problem auf.

    Der "Short"-Pfad wird auch unbeabsichtigt in alle anderen CString-Membervariablen abgelegt die ich in diesem Projekt benutze.

    Ich weiss nicht wirklich woran das liegt.

    void CMXFboxDlg::OnFileopen1() 
    {
    
    	CFileDialog m_ldFile1(TRUE);
    
    	// Dialogfeld Öffnen zeigen und Ergebnis auffangen
    	if (m_ldFile1.DoModal() == IDOK)
    	{
    	// Gewählten Dateinamen ermitteln
    	m_sInput1 = m_ldFile1.GetPathName();
    	// DOS bzw. Win-32 kompatiblen Pfad erzeugen
    	GetShortPathName(m_sInput1, (LPTSTR)(LPCTSTR)m_sShortInput1,100);
    	// Dialogfeld aktualisieren
    	UpdateData(FALSE);
    	}	
    }
    


  • randell schrieb:

    Der "Short"-Pfad wird auch unbeabsichtigt in alle anderen CString-Membervariablen abgelegt die ich in diesem Projekt benutze.

    Meinst du jetzt, dass bereits ermittelte Pfade dann in Kurz-Form sind, oder werden eben nur danach neu ermittelte Pfadangaben in der Kurz-Form geliefert?! 😕



  • ich habe mehere stringvariablen in denen eigentlich erstmal gar nichts drinstehen sollte. Nachdem aber getshortpathname für die variable m_sInput1 ausgeführt wird, enthalten auf einmal alle stringvariablen den Pfad aus m_sShortInput1.

    vor GetShortPathName(m_sInput1, (LPTSTR)(LPCTSTR)m_sShortInput1,100);

    m_sInput1 => "C:\Testfiles Input\file1"
    m_sShortInput1 => ""
    m_sInput2 => ""
    m_sInput3 => ""
    m_sOutput1 => ""
    ...
    nach GetShortPathName(m_sInput1, (LPTSTR)(LPCTSTR)m_sShortInput1,100);
    m_sShortInput1 => "C:\Testfi~1\file1"
    m_sInput1 => "C:\Testfi~1\file1"
    m_sInput2 => "C:\Testfi~1\file1"
    m_sInput3 => "C:\Testfi~1\file1"
    m_sOutput1 => "C:\Testfi~1\file1"
    ...



  • Dann nehme ich mal an, dass all diese Member-Variablen auf den selber Speicher-Bereich zeigen 🙄



  • Dann würde dass problem aber auch bei anderen operationen auftauchen, oder?
    Wenn ich mit .GetPathName arbeite bleiben die Speicherbereiche von den anderen Variablen ja auch leer.



  • GetPathName 😕 Wie hast du denn deine ganzen Variablen definiert und initialisiert?!



  • Meine Variablen sind MFC CStringvariablen die im Public-Bereich einer Dialogfeldklasse definiert sind.
    hab die sache in diesem forum gepostet, da es sich bei createprocess ja eigentlich um eine winapi funktion handelte.

    Was mein problem angeht. ich hab nun in der Funktion

    GetShortPathName(m_sInput1, (LPTSTR)(LPCTSTR)m_sShortInput1,100);
    

    den parameter lpszShortPath:

    (LPTSTR)(LPCTSTR)m_sShortInput1
    

    durch eine TCHAR Variable ersetzt und dann hat alles funktioniert.

    anscheinend funktioniert das casten von CStrings auf diese weise wohl nicht immer, obwohl es z.B. bei createprocess funktioniert hat.

    trotzdem aber nochmal danke für die tipps.
    randell



  • sorry, noch eine Frage.

    Liege ich richtig, dass man mit GetShortPathName nur Datei-Pfade konvertieren kann, die wirklich auf der Platte schon existieren?

    Wie kann ich denn den Pfad einer Datei konvertieren, die ich über die Konsole erst erzeuge?



  • Erzeuge doch erst die Datei und ermittel dann den dazugehörigen Kurz-Namen - im Vorhinein kannst du den nicht bestimmen 😉



  • das ist ja gerade mein problem.
    das konsolenprogramm benötigt ja den konvertierten datei- bzw. pfadnamen um die datei erzeugen zu können.

    konsolenprogramm:
    anwendung.exe inputfile outputfile



  • Ich verstehe dein Problem nicht so ganz 🙄
    Wenn die Datei nicht existieren darf, dann kannst du ja eh nur kurze Dateinamen verwenden 😉



  • ich weiss nicht vielleicht hab ich ja auch dich falsch verstanden.

    warum ich die ganze sache mache:
    ich hab in MFC eine Oberfläche erstellt, die auf eine Konsolenanwendung aufsetzt. Die Konsolenanwendung rufe ich über die winapi createprocess auf, die die entsprechenden parameter als string an die Konsolenanwendung übergibt.

    Die Konsolenanwendung benötigt ein Inputfile(z.B. ein avi-file) und konvertiert dies in ein Outputfile(z.B. Mpeg).
    damit die konsolenanwendung weiss wohin u. in welchem format sie die datei speichern soll, muss ich ihr den pfad übergeben.

    Beispiel:

    anwendung.exe "C:\testfiles\test.avi" "C:\testfiles\test.mpeg"

    das ganze jetzt mit stringvariablen:

    anwendung.exe m_sInputfile m_sOutputfile

    das klappt solange keine leerzeichen im pfad auftauchen



  • Wandel doch einfach den Pfad der Input-Datei um, schneide den Dateinamen ab und setzt den Output-Filenamen dran 🙄



  • dazu müsste man voraussetzen, dass der benutzer das outputfile immer im gleichen ordner wie das inputfile speichern möchte.

    ich könnte den filename vom outputpfad abschneiden, dann getshortpathname ausführen und dann den filename wieder anhängen...wäre aber dann wirklich von hinten durch die brust ins auge...und das dann auch noch für 3 verschiedene Outputfiles.

    gibt es wirklich keine andere möglichkeit?



  • Irgendwie verstehe ich dein Problem absolut nicht - du übergibst einfach den langen Pfad an GetShortPathName (so wie ich das sehe musst du nicht unbedingt eine Datei angeben) und hängst dann einfach den Dateinamen an 😕



  • o.k. jetzt läufts.
    vielen dank für die hilfe


Log in to reply