Mostrar el cuadro de diálogo "Abrir con..."
Artículo por Club Developers · 31 diciembre 2005
5000 vistas
Puede que en algún momento necesitemos mostrar el cuadro de diálogo "Abrir con..." que se abre cuando un usuario intenta ejecutar un fichero sin tener asociada la extensión a ninguna aplicación. Lamentablemente no hay ninguna función del API de Windows clásica para ello.
Este cuadro de diálogo está implementado en la DLL shell32.dll y sólo es usada por la shell misma. Sin embargo es posible llamarlo de forma sencilla mediante ShellExecute.
Aquà mostramos un procedimiento que efectua esta operación para el nombre de un fichero pasado por parámetro:
Esta función se usa amenudo después de haber intentado abrir un fichero con ShellExecute. Veamos una función que realiza las dos llamadas si son necesarias, claro:
Este cuadro de diálogo está implementado en la DLL shell32.dll y sólo es usada por la shell misma. Sin embargo es posible llamarlo de forma sencilla mediante ShellExecute.
Aquà mostramos un procedimiento que efectua esta operación para el nombre de un fichero pasado por parámetro:
delphi
uses  SysUtils, ShellAPI, Windows; procedure OpenWith(const Filename: string); { llama al cuadro de diálogo "Abrir con..." para el fichero pasado por parámetro } begin  ShellExecute(0, 'open', 'rundll32.exe',   PChar('shell32.dll,OpenAs_RunDLL ' + Filename),   PChar(ExtractFilePath(Filename)), SW_SHOWNORMAL); end;
Esta función se usa amenudo después de haber intentado abrir un fichero con ShellExecute. Veamos una función que realiza las dos llamadas si son necesarias, claro:
delphi
uses  SysUtils, ShellAPI, Windows; function OpenFile(const Filename: string; const Handle: THandle = 0): boolean; { intenta abrir el fichero pasado por parámetro con el programa asociado a su  extensión (si lo hay). En caso de que no existiera asociación, mostrarÃa  el cuadro de diálogo "Abrir con..." } var  errCode: Cardinal;  filePath: string; begin  { guardamos la ruta para evitar tener que hacerlo 2 veces }  filePath := ExtractFilePath(Filename);  { intentamos abrir el archivo }  errCode := ShellExecute(Handle, 'Open', PChar(Filename), '',   PChar(filePath), SW_SHOWNORMAL);  { si la tentativa termina con el código SE_ERR_NOASSOC, quiere decir que no hay programa asociado }  if errCode = SE_ERR_NOASSOC then   { en este caso, mostramos el diálogo }   errCode := ShellExecute(0, 'open', 'rundll32.exe',      PChar('shell32.dll,OpenAs_RunDLL ' + Filename),      PChar(filePath), SW_SHOWNORMAL);  { si el código revuelto por ShellExecute es superior a 32 indica que la operación ha tenido éxito, sino es un código de error }  Result := errCode > 32; end;