c++ - shellexecuteex - Seleccionando programáticamente el archivo en el explorador
shellexecute vba (3)
En mi aplicación puedo abrir el explorador mediante programación y seleccionar un archivo con el siguiente código:
void BrowseToFile(LPCTSTR filename)
{
CString strArgs;
strArgs = _T("/select,/"");
strArgs += filename;
strArgs += _T("/"");
ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL);
}
Mi problema es que si llamo a esta función por segunda vez con un archivo diferente, pero en la misma carpeta, la selección en el explorador no cambia al nuevo archivo, sino que permanece en el archivo anterior.
Por ejemplo, si llamo a mi función con C:/path/to/file1.txt
, se C:/path/to/file1.txt
una nueva ventana del explorador y se seleccionará file1.txt
. Si llamo a mi función por segunda vez con C:/path/to/file2.txt
, se C:/path/to/file2.txt
la ventana del explorador existente, pero la selección aún estará en file1.txt
.
¿Hay una manera de forzar al explorador a actualizar la selección o una mejor manera de lograr esto?
EDITAR:
El comportamiento mencionado anteriormente fue en Windows XP. Parece que el comportamiento en Vista / Win7 es diferente. Cada llamada abrirá una nueva instancia de explorer y seleccionará el archivo.
Mi objetivo principal es replicar la opción de Visual Studio para abrir la carpeta que contiene un documento. Esta característica en Visual Studio se comporta de la misma forma en XP, Vista y Win7. No creará una nueva instancia si otra instancia con la misma carpeta ya está abierta, pero actualizará la selección al nuevo archivo.
Si alguien sabe cómo Visual Studio logra esto, me encantaría saberlo.
En el caso de que lo hayas descrito, la ventana del archivo solo selecciona el archivo cuando se inicializa en lugar de cuando se activa.
Aunque se siente como un kludge, podría detectar XP y solo para ese sistema operativo, cierre el cuadro de diálogo con el controlador y abra uno nuevo para seleccionar otro archivo.
Encontré la respuesta a mi pregunta. Necesito usar la función de shell SHOpenFolderAndSelectItems
. Aquí está el código para la función si alguien está interesado:
void BrowseToFile(LPCTSTR filename)
{
ITEMIDLIST *pidl = ILCreateFromPath(filename);
if(pidl) {
SHOpenFolderAndSelectItems(pidl,0,0,0);
ILFree(pidl);
}
}
Pruebe la opción ''/ n''. Esto, sin embargo, abrirá una nueva carpeta - quizás ya abierta. Pero, al menos, el archivo que especifique está seleccionado.
/n,/select,<path_and_filename>
SHOpenFolderAndSelectItems siempre falla en mi caso y no puedo entender por qué. Por cierto, debe llamar a CoInitialize / CoInitializeEx antes de llamar a este.