Come aprire una finestra di dialogo predefinita per la finestra se ShelexEcute non riesce a causa di nessuna associazione di file in C ++?

StackOverflow https://stackoverflow.com/questions/6364879

Domanda

Posso utilizzare la funzione Windows ShelexEcute per aprire un file senza problemi fintanto che il file ha un'associazione corretta.

Se non esiste alcuna associazione, vorrei utilizzare la finestra di dialogo Windows predefinita per aprire il file:

image

È possibile? Se é cosi, come?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top