Come aprire una finestra di dialogo predefinita per la finestra se ShelexEcute non riesce a causa di nessuna associazione di file in C ++?
-
28-10-2019 - |
Soluzione
Il documentato modo Per mostrare che la finestra di dialogo consiste nell'utilizzare il verbo Openas.
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE);
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.fMask = SEE_MASK_NOASYNC;
sei.nShow = SW_SHOWNORMAL;
sei.lpVerb = "openas";
sei.lpFile = "C:\\yourfile.ext";
ShellExecuteEx(&sei);
Se controlli sotto HKEY_CLASSES_ROOT\Unknown\shell\openas
Vedi che questo è lo stesso di chiamare l'esportazione (non documentata) OpenAS_Rundll in shell32.
Altri suggerimenti
Eseguire RUNDLL32 Shell32,OpenAs_RunDLL path/to/file/to/open
Semplicemente non usare verbo esplicito. L'uso di un verbo specifico come "aperto" è un grosso errore:
- 'Apri' potrebbe non essere un verbo predefinito (ad esempio, potrebbe essere 'play', 'modifica' o 'run')
- "aperto" potrebbe non esistere
È molto più corretto per Basta passare null come verbo. Il sistema selezionerà automaticamente il verbo più appropriato:
- Verrà utilizzato il verbo predefinito, se è impostato
- Verrà utilizzato il verbo "aperto", se non è impostato alcun verbo predefinito
- Verrà utilizzato il primo verbo, se non sono disponibili verbi predefiniti e "aperti"
- Se non vengono assegnati verbi, il sistema aprirà "con" finestra di dialogo
In altre parole, semplice
ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);
Mostrerà la finestra di dialogo "Apri con".
Usare solo a specifico verbo se vuoi un specifico azione. Ad esempio, "Print", "Explore", "Runas". Altrimenti - passa solo zero.