Pregunta

Solía ??poder iniciar una aplicación de ayuda instalada localmente registrando un determinado tipo mime en el registro de Windows. Esto me permitió permitir a los usuarios hacer clic una vez en un enlace a la instalación actual de nuestra aplicación de navegador interno. Esto funcionó bien en Internet Explorer 5 (la mayoría de las veces) y Firefox, pero ahora no funciona en Internet Explorer 7.

El nombre de archivo pasado a mi shell / open / command no es la ruta física completa al paquete de instalación descargado. El parámetro de ruta que me entrega IE es

"C:\Document and Settings\chq-tomc\Local Settings\Temporary Internet Files\
  EIPortal_DEV_2_0_5_4[1].expd"

Desafortunadamente, esto no se resuelve en el archivo físico al llamar a FileExists () o al intentar crear un objeto TFileStream .

Falta la ruta física en el subdirectorio de almacenamiento en caché oculto de Internet Explorer para los Archivos temporales de Internet de " Content.IE5 \ ALBKHO3Q cuya ruta absoluta se expresaría como

"C:\Document and Settings\chq-tomc\Local Settings\Temporary Internet Files\ 
  Content.IE5\ALBKHO3Q\EIPortal_DEV_2_0_5_4[1].expd"

Sí, los subdirectorios son generados aleatoriamente por IE y eso no debería ser una preocupación siempre que IE pase la ruta completa a mi aplicación de ayuda, que desafortunadamente no está haciendo.

La instalación de la aplicación mime helper no es una preocupación. Se instala / actualiza mediante un script de inicio de sesión global para los más de 10,000 usuarios en todo el mundo. El asistente de mime solo se invoca cuando el usuario hace clic en una página web interna con un enlace a una instalación de nuestra aplicación de navegador de escritorio. Esa instalación se devuelve con un tipo mime de " application / x-expeditors " . El registro del tipo mime " .expd " / " application / x-expeditors " se ve así:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.expd] 
@="ExpeditorsInstaller"
"Content Type"="application/x-expeditors"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller]
"EditFlags"=hex:00,00,01,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell\open]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ExpeditorsInstaller\shell\open\command]
@="\"C:\\projects\\desktop2\\WebInstaller\\WebInstaller.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type\application/x-expeditors]
"Extension"=".expd"

Consideré enumerar todas las entradas de caché de IE de un usuario, pero me preocuparía cuánto tiempo puede llevar a examinarlas todas o que puedo encontrar una entrada de caché más antigua antes de la entrada actual que estoy buscando. Sin embargo, el sufijo de nombre de archivo entre corchetes " [n] " puede ser la clave única.

He intentado el método de Wininet GetUrlCacheEntryInfo pero eso requiere la URL, no la ruta virtual entregada por IE.

Mi esperanza es que exista una función de Shell que, dada una ruta virtual, devuelva la ruta física.

¿Fue útil?

Solución 5

Un poco de seguimiento para cerrar esta pregunta.

Resultó que el problema real era cómo estaba creando el identificador de archivo utilizando TFileStream. Cambié para abrir con fmOpenRead o fmShareDenyWrite que resolvió lo que resultó ser un problema de bloqueo de archivos.

srcFile := TFileStream.Create(physicalFilename, fmOpenRead or fmShareDenyWrite);

Otros consejos

Creo que los subdirectorios creados por IE se generan de forma aleatoria, por lo que no podrá garantizar que se le asigne el mismo nombre cada vez, y el problema que veo con el método de registro es que solo funciona cuando el archivo aún está en el caché ... vaciar el caché purgaría el archivo que requiere otra instalación.

¿No sería mejor instalar este asistente en los datos de la aplicación?

No estoy seguro de esto, pero quizás esto pueda llevarlo en la dirección correcta: intente usar las funciones de caché de URL desde la DLL de wininet: FindFirstUrlCacheEntry , FindNextUrlCacheEntry , FindCloseUrlCache para la enumeración y cuando ubique una entrada cuyo nombre de archivo local coincida con la ruta dada, puede usar RetrieveUrlCacheEntryFile para recuperar el archivo.

Estoy usando un sistema similar con el navegador X-Appl para mostrar las aplicaciones web de WAML y funciona perfectamente. Tal vez debería echar un vistazo a cómo lograron hacerlo.

Parece que iexplore está pasando el espacio de nombres de shell " nombre " del archivo en lugar del nombre del sistema de archivos.

No creo que haya una forma documentada de pasar un ID de elemento de shell en la línea de comandos: el explorador lo hace a sí mismo, pero existen consideraciones de cálculo de referencias ya que los identificadores de elemento de shell son (punteros a) estructuras de datos binarios que solo son válidas en un solo proceso.

Lo que podría intentar hacer es: 1. Llame a SHGetDesktopFolder, que devolverá el objeto IShellFolder raíz del espacio de nombres de shell. 2. Llame a IShellFolder :: ParseDisplayName para convertir el nombre que se le devuelve en una lista de ID de elemento de shell. 3. Pruebe el IShellFolder :: GetDisplayNameOF con el indicador SHGDN_FORPARSING, que, francamente, se siente como si hubiéramos ido en un círculo completo y estuviéramos de regreso donde empezamos. Porque creo que esta API es la responsable final de devolver el " incorrecto " ruta relativa del sistema de archivos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top