Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una vez que la aplicación haya localizado un objeto de archivo, el siguiente paso suele ser actuar en él de alguna manera. Por ejemplo, es posible que la aplicación quiera iniciar otra aplicación que permita al usuario modificar un archivo de datos. Si el archivo de interés es un ejecutable, es posible que la aplicación quiera simplemente iniciarlo. En este documento se describe cómo usar ShellExecute o ShellExecuteEx para realizar estas tareas.
Uso de ShellExecute y ShellExecuteEx
Para usar ShellExecute o ShellExecuteEx, la aplicación debe especificar el objeto de archivo o carpeta en el que se va a actuar y un verb que especifica la operación. Para ShellExecute, asigne estos valores a los parámetros adecuados. Para ShellExecuteEx, rellene los miembros adecuados de una estructura SHELLEXECUTEINFO. También hay varios otros miembros o parámetros que se pueden usar para ajustar el comportamiento de las dos funciones.
Los objetos file y folder pueden formar parte del sistema de archivos o de los objetos virtuales, y se pueden identificar mediante rutas de acceso o punteros a listas de identificadores de elementos (PIDL).
Verbos asociados a objeto
Los verbos disponibles para un objeto son esencialmente los elementos que se encuentran en el menú contextual de un objeto. Para buscar qué verbos están disponibles, consulte el registro en el directorio correspondiente.
HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Shell\verb
donde object_clsid es el identificador de clase (CLSID) del objeto y verb es el nombre del objeto disponible verb. La verb\subclave del comando contiene los datos que indican lo que sucede cuando se invoca ese verb.
Para averiguar qué verbos están disponibles para los objetos predefinidosShell, busque en el registro en .
\ HKEY_CLASSES_ROOTobject_name\shell\verb
donde object_name es el nombre del objeto predefinido Shell . De nuevo, la verb\ subclave del comando contiene los datos que indican lo que sucede cuando se invoca.verb
Entre los verbos disponibles habitualmente se incluyen los siguientes:
Verb | Descripción |
---|---|
edit | Inicia un editor y abre el documento para su edición. |
find | Inicia una búsqueda a partir del directorio especificado. |
open | Inicia una aplicación. Si este archivo no es un archivo ejecutable, se inicia su aplicación asociada. |
Imprime el archivo de documento. | |
properties | Muestra las propiedades del objeto. |
runas | Inicia una aplicación como administrador. El Control de cuentas de usuario (UAC) solicitará al usuario que dé su consentimiento para ejecutar la aplicación con privilegios elevados o escribirá las credenciales de una cuenta de administrador que se usa para ejecutar la aplicación. |
Cada verb corresponde al comando que se usaría para iniciar la aplicación desde una ventana de consola. open verb es un buen ejemplo, ya que se admite normalmente. Para .exe archivos, open simplemente inicia la aplicación. Sin embargo, se suele usar para iniciar una aplicación que opera en un archivo determinado. Por ejemplo, Microsoft WordPad puede abrir archivos .txt. El openverb para un archivo .txt correspondería por lo tanto a algo parecido al siguiente comando:
"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"
Cuando se usa ShellExecute o ShellExecuteEx para abrir un archivo .txt, se inicia Wordpad.exe con el archivo especificado como argumento. Algunos comandos pueden tener argumentos adicionales, como marcas, que se pueden agregar según sea necesario para iniciar la aplicación correctamente. Para obtener más información sobre los menús contextuales y los verbos, vea Extender menús contextuales.
En general, intentar determinar la lista de verbos disponibles para un archivo determinado es algo complicado. En muchos casos, simplemente puede establecer el parámetro lpVerb en NULL, que invoca el comando predeterminado para el tipo de archivo. Este procedimiento suele ser equivalente a establecer lpVerb en "open", pero algunos tipos de archivo pueden tener un comando predeterminado diferente. Para obtener más información, vea Extender menús contextuales y la documentación de referencia shellExecuteEx .
Uso de ShellExecuteEx para proporcionar servicios de activación desde un sitio
Los servicios de una cadena de sitio pueden controlar muchos comportamientos de activación de elementos. A partir de Windows 8, puedes proporcionar un puntero a la cadena de sitios web a ShellExecuteEx para activar estas funcionalidades. Para proporcionar el sitio a ShellExecuteEx:
- Especifique la marca SEE_MASK_FLAG_HINST_IS_SITE en el miembro fMask de SHELLEXECUTEINFO.
- Proporcione el IUnknown en el miembro hInstApp de SHELLEXECUTEINFO.
Usar ShellExecute para iniciar el cuadro de diálogo Buscar
Cuando un usuario hace clic con el botón derecho en un icono de carpeta en el Explorador de Windows, uno de los elementos de menú es "Buscar". Si seleccionan ese elemento, Shell inicia su utilidad de búsqueda. Esta utilidad muestra un cuadro de diálogo que se puede usar para buscar archivos de una cadena de texto especificada. Una aplicación puede iniciar mediante programación la utilidad search para un directorio llamando a ShellExecute, con "find" como parámetro lpVerb y la ruta de acceso del directorio como el parámetro lpFile . Por ejemplo, la siguiente línea de código inicia la utilidad Search para el directorio c:\MyPrograms.
ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);
Un ejemplo sencillo de cómo usar ShellExecuteEx
La siguiente aplicación de consola de ejemplo muestra el uso de ShellExecuteEx. La mayoría del código de comprobación de errores se ha omitido para mayor claridad.
#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>
main()
{
LPITEMIDLIST pidlWinFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfWinFiles = NULL;
IShellFolder *psfDeskTop = NULL;
LPENUMIDLIST ppenum = NULL;
STRRET strDispName;
TCHAR pszParseName[MAX_PATH];
ULONG celtFetched;
SHELLEXECUTEINFO ShExecInfo;
HRESULT hr;
BOOL fBitmap = FALSE;
hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
hr = psfDeskTop->Release();
hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
CoTaskMemFree(pidlItems);
if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
{
fBitmap = TRUE;
break;
}
}
ppenum->Release();
if(fBitmap)
{
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = pszParseName;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
}
CoTaskMemFree(pidlWinFiles);
psfWinFiles->Release();
return 0;
}
La aplicación recupera primero el PIDL del directorio de Windows y enumera su contenido hasta que encuentra el primer archivo .bmp. A diferencia del ejemplo anterior, IShellFolder::GetDisplayNameOf se usa para recuperar el nombre de análisis del archivo en lugar de su nombre para mostrar. Dado que se trata de una carpeta del sistema de archivos, el nombre de interpretación es una ruta de acceso completa, que es lo que se necesita para ShellExecuteEx.
Una vez que se encuentra el primer archivo .bmp, los valores adecuados se asignan a los miembros de una estructura SHELLEXECUTEINFO . El miembro lpFile se establece en el nombre de análisis del archivo y el miembro lpVerb en NULL para comenzar la operación predeterminada. En este caso, la operación predeterminada es "abierta". A continuación, la estructura se pasa a ShellExecuteEx, que inicia el controlador predeterminado para los archivos de mapa de bits, normalmente MSPaint.exe, al open archivo . Después de que la función devuelve, se liberan los PIDL y se libera la interfaz IShellFolder de la carpeta Windows.