CreateProcess + Explorer Problem



  • Hi, ich habe ein seltsames Problem mit dem Explorer unter winxp SP3

    std::string winPath = "c:\\windows\\explorer.exe";
              std::string cmd = "/n, /e, /select,\"e:\\folder\\s1\\s12\\test.txt\"";
    
              MessageBoxA(0,cmd.c_str(),winPath.c_str(),0);
              if( !CreateProcess( winPath.c_str(), 
                                  (LPSTR)(cmd.c_str()),
                                  NULL,NULL,FALSE, NORMAL_PRIORITY_CLASS,
                                  NULL,
                                  (LPSTR)(path.c_str()),
                                  &StartupInfo, &ProcInfo))
              {
                string err = ErrorString(GetLastError());
                MessageBoxA(0, err.c_str(), "Error on starting explorer", 0);
              }
    

    tippe ich genau das in die cmd öfnet sich der explorer an der gewünschten Stelle und selektiert das element.

    mit CreateProcess kommt immer der Fehler "Verzeichnis nicht gefunden".
    mit ShellExecute funktioniert es ebenfalls.

    HINSTANCE ret = ShellExecute(0, "open", winPath.c_str(), cmd.c_str(), "c:\\",SW_SHOW);
              if(((unsigned int)ret) <= 32)
              {
                MessageBoxA(0,"fehler","fehler",0);
              }
    

    Hat vielleicht jemand einen Tip?
    Unicode ist nicht aktiv



  • 1. Casten deutet immer auf einen Fehler hin!
    2. Lass den ersten Parameter von CreateProcess "NULL" und übergebe alles im 2. Parameter!; Oder mach es richtig und gibt im 2. Parameter auch den Prozesnamen noch mit an!
    3. Doku lesen!



  • Jochen Kalmbach schrieb:

    1. Casten deutet immer auf einen Fehler hin!

    ok, hier habe ich übersehen das bei dem Parameter das C fehlt.
    Ich hab mich schon gewundert, warum der erste funktioniert.

    durch den Hinweis mit den Casts hab aber den Fehler gefunden:
    mir ist aufgefallen, dass ich den working dir-Parameter gefüllt habe, der in dem Fall falsch war.

    2. Lass den ersten Parameter von CreateProcess "NULL" und übergebe alles im 2. Parameter!; Oder mach es richtig und gibt im 2. Parameter auch den Prozesnamen noch mit an!

    wie meinst du das mit den Prozesnamen?
    Ich hab das ganze so verstanden, dass
    entweder
    par1 = programm und par2 = Argumente
    oder
    par1 = NULL und par2 = "Programm Argumente"

    par1 = programm und par2 = "Programm Argumente"
    kann doch nicht funktionieren, programm würde dann doch zu den Argumenten gehören

    3. Doku lesen!

    hab ich eigentlich getan, aber wie das so ist, manche Sachen übersieht man dann doch

    vielen dank!



  • Wenn Du "programm" angibst, dann musst Du es so machen:
    par1 = programm und par2 = "Programm Argumente"

    Sonst kommen die meisten programme nicht damit klar. Fast jedes Programm erwartet als erstes Argument den prozessnamen!

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425

    If both lpApplicationName and lpCommandLine are non-NULL, the null-terminated string pointed to by lpApplicationName specifies the module to execute, and the null-terminated string pointed to by lpCommandLine specifies the command line. The new process can use GetCommandLine to retrieve the entire command line. Console processes written in C can use the argc and argv arguments to parse the command line. Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line.



  • Jochen Kalmbach schrieb:

    Wenn Du "programm" angibst, dann musst Du es so machen:
    par1 = programm und par2 = "Programm Argumente"

    Sonst kommen die meisten programme nicht damit klar. Fast jedes Programm erwartet als erstes Argument den prozessnamen!

    Ok, ich hätte angenommen, das wäre die Aufgabe der API, dafür zu sorgen.

    Der erste Parameter ist doch damit quasi überflüssig, oder nicht



  • vlad_tepesch schrieb:

    Der erste Parameter ist doch damit quasi überflüssig, oder nicht

    Das hatte ich doch schon in meinem ersten posting gesagt, oder?



  • Eine andere Möglichkeit ist, um eine Datei im Explorer, zu markieren, ist es die SHOpenFolderAndSelectItems Funktion zu benutzen. Dazu gibt es auch ein Beispiel: http://stackoverflow.com/a/3010871/832220



  • shell schrieb:

    Eine andere Möglichkeit ist, um eine Datei im Explorer, zu markieren, ist es die SHOpenFolderAndSelectItems Funktion zu benutzen. Dazu gibt es auch ein Beispiel: http://stackoverflow.com/a/3010871/832220

    danke für diesen super Tip!
    damit scheint es auch möglich zu sein, mehrere Dateien zu markieren.
    Das geht über die Kommandozeile scheinbar nicht.



  • Jetzt öffnet sich zwar ein explorer fenster mit allen selektierten Dateien, aber leider ohne navigations-baum.
    kann man den auch gleich irgendwie aktivieren?


Anmelden zum Antworten