Comment ouvrir une boîte de dialogue par défaut pour la fenêtre si ShellExecute échoue en raison de l'absence d'association de fichiers en C ++?
-
28-10-2019 - |
La solution
Le documenté moyen de montrer que le dialogue est d'utiliser le verbe 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);
Si vous vérifiez sous HKEY_CLASSES_ROOT\Unknown\shell\openas
, vous voyez que cela revient à appeler l'export OpenAs_RunDLL (non documenté) dans shell32.
Autres conseils
Exécutez RUNDLL32 Shell32,OpenAs_RunDLL path/to/file/to/open
N'utilisez simplement pas de verbe explicite.Utiliser un verbe spécifique comme «ouvrir» est une grosse erreur:
- 'open' peut ne pas être un verbe par défaut (par exemple, il peut s'agir de 'play', 'edit' ou 'run')
- "ouvert" peut ne pas exister
Il est plus correct de simplement passer NULL comme verbe .Le système sélectionnera automatiquement le verbe le plus approprié:
- Le verbe par défaut sera utilisé, s'il est défini
- Le verbe 'open' sera utilisé, si aucun verbe par défaut n'est défini
- le premier verbe sera utilisé, si aucun verbe par défaut et "ouvert" n'est disponible
- si aucun verbe n'est attribué - le système affichera la boîte de dialogue "Ouvrir avec"
En d'autres termes, simple
ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);
affichera la boîte de dialogue "Ouvrir avec".
N'utilisez un verbe spécifique que si vous souhaitez une action spécifique .Par exemple.'imprimer', 'explorer', 'runas'.Sinon, passez simplement nul.