Oppure

Loading
20/10/10 19:42
jerry74
Sera a tutti, nel creare una piccola applicazione ho avuto la necessità di avviare un file exe; dopo diverse ricerche ho creato il seguente codice che funziona correttamente:

    // acquisisco il percorso di esecuzione del file
    TCHAR *tchar_string = (argv[0]);
    // lo trasformo in una wstring
    std::wstring path (tchar_string);
    //elimino la parte relativa al nome del file ed estensione
    path = path.substr(0, path.rfind('\'));
    // converto il percorso in const wchar_t
    const wchar_t* tpath = path.c_str();
    // converto in wchar_t
    wchar_t* __tpath = new wchar_t[0xFF];
    wcscpy_s(__tpath, 200, tpath);
    // acquisisco cartella e nome file da avviare
    wchar_t* __file__ = TEXT("\fw40\setup.exe");
    // Creo il percorso completo
    std::wcscat(__tpath, __file__);
    // Avvio il programma
    ShellExecuteW(NULL,TEXT("open"),__tpath,NULL,NULL,SW_SHOWNORMAL);


Per puro scopo didattico, questo codice è già ottimale oppure si può migliorare?
Mi sembra che ci siano troppe conversioni tra tipi o sbaglio?
aaa
22/10/10 2:19
HeDo

ma se è un file exe, che senso ha passare per la shellexecute?
molto meglio usare direttamente CreateProcess: msdn.microsoft.com/en-us/library/…(v=VS.85).aspx
aaa
22/10/10 8:07
jerry74
All'inizio pensavo di usare System("comando";) ma l'ho subito scartato ed ho visto che si può avviare un file exe con shellexecute. In CreateProcess non mi ero ancora imbattuto. Stasera provo e vedo come funziona.
Se non ho capito male shellexecute apre una shell nella quale esegue il file che gli passo come parametro mentre CreateProcess avvia direttamente uil file come un processo. Avviando direttamente il processo occupa meno risorse, è per questo che è consigliabile usarlo?
aaa
22/10/10 11:14
HeDo
Postato originariamente da jerry74:

All'inizio pensavo di usare System("comando";) ma l'ho subito scartato ed ho visto che si può avviare un file exe con shellexecute. In CreateProcess non mi ero ancora imbattuto. Stasera provo e vedo come funziona.
Se non ho capito male shellexecute apre una shell nella quale esegue il file che gli passo come parametro mentre CreateProcess avvia direttamente uil file come un processo. Avviando direttamente il processo occupa meno risorse, è per questo che è consigliabile usarlo?


credo che sia un'ottimizzazione abbastanza inutile, ad ogni modo la shellexecute è in grado di lanciare qualsiasi tipo di file, richiamando il loader opportuno. Ad esempio, se gli passi un documento word lei lancerà word in apertura di quel file, questo comporta uno scan dell'estensione e diversi accessi al registro per capire cosa fare con quel determinato tipo di file.
La CreateProcess invece è in grado di caricare in memoria solo file eseguibili (exe), quindi risparmi diversi passaggi interni.
Nonostante tutto questo non noterai MAI la differenza di tempo per l'apertura, al limite utilizzando funzioni come GetTickCount o i performance counters riusciresti a registrare il miglioramento, anche se di qualche millisecondo.
aaa
22/10/10 20:38
jerry74
Postato originariamente da HeDo:

Ad esempio, se gli passi un documento word lei lancerà word in apertura di quel file, questo comporta uno scan dell'estensione e diversi accessi al registro per capire cosa fare con quel determinato tipo di file.


Questa è una cosa che non conoscevo e che può tornare utile in futuro. Nel caso specifico, userò CreateProcess perchè devo solo avviare file exe.

Ma le diverse conversioni di tipo presenti nel codice non hanno impatto sulle prestazioni?
aaa