¿Cómo abrir un cuadro de diálogo predeterminado para la ventana si ShellexCute falla debido a la asociación de archivos en C ++?
-
28-10-2019 - |
Solución
los documentado camino Para mostrar que el diálogo es usar el 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);
Si lo revisas debajo HKEY_CLASSES_ROOT\Unknown\shell\openas
Usted ve que esto es lo mismo que llamar a la exportación (indocumentada) OpenAs_rundll en Shell32.
Otros consejos
Ejecutar RUNDLL32 Shell32,OpenAs_RunDLL path/to/file/to/open
Simplemente no use verbo explícito. Usar un verbo específico como 'abierto' es un gran error:
- 'Open' puede no ser un verbo predeterminado (por ejemplo, puede ser 'Play', 'Editar' o 'Ejecutar')
- 'Abierto' puede no existe
Es mucho más correcto a Simplemente pase nulo como verbo. El sistema seleccionará automáticamente el verbo más apropiado:
- Se utilizará el verbo predeterminado, si está configurado
- Se utilizará el verbo 'abierto', si no se establece un verbo predeterminado
- Se utilizará el primer verbo, si no hay verbos predeterminados y 'abiertos' disponibles
- Si no se asignan verbos, el sistema traerá el cuadro de diálogo "Abrir con"
En otras palabras, simple
ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);
Mostrará el diálogo "abierto con".
Solo usa un específico verbo si quieres un específico acción. Por ejemplo, 'imprimir', 'explorar', 'runas'. De lo contrario, simplemente pase nulo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow