¿Cómo se obtiene de manera confiable la carpeta Inicio rápido en XP y Vista?

StackOverflow https://stackoverflow.com/questions/76080

  •  09-06-2019
  •  | 
  •  

Pregunta

Necesitamos obtener de manera confiable la carpeta Inicio rápido para todos y los usuarios actuales tanto en Vista como en XP.Estoy desarrollando en C++, pero probablemente sea más una pregunta general sobre la API de Windows.

Como referencia, aquí hay un código para obtener la carpeta Datos de la aplicación en ambos sistemas:

    HRESULT hres; 
    CString basePath;
    hres = SHGetSpecialFolderPath(this->GetSafeHwnd(), basePath.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
    basePath.ReleaseBuffer();

Sospecho que esto es sólo una cuestión de saber qué subcarpeta usa Microsoft.

En Windows XP, la subcarpeta de datos de la aplicación es:

Microsoft\Internet Explorer\Inicio rápido

En Vista, parece que la subcarpeta se ha cambiado a:

Roaming\Microsoft\Internet Explorer\Inicio rápido

pero me gustaría asegurarme de que esta sea la forma correcta de determinar la ubicación correcta.

Encontrar el correcto La forma de determinar esta ubicación es bastante importante, ya que confiar en nombres de carpetas codificados casi siempre se rompe a medida que avanza hacia instalaciones internacionales, etc.El hecho de que la carpeta se llame 'Roaming' en Vista me hace preguntarme si hay algún manejo especial relacionado con esa carpeta (similar a la carpeta Configuración local en XP).

EDITAR:El siguiente artículo de msdn: http://msdn.microsoft.com/en-us/library/bb762494.aspx indica que CSIDL_APPDATA tiene un ID equivalente a FOLDERID_RoamingAppData, lo que parece respaldar la afirmación de StocksR de que CSIDL_APPDATA devuelve C:\Users\xxxx\AppData oaming, por lo que debería ser posible usar la misma ruta relativa para que CSIDL_APPDATA acceda al inicio rápido (\Microsoft\Internet Explorer\Inicio rápido).

Entonces el siguiente algoritmo es correcto según MS:

HRESULT hres; 
CString basePath;
hres = SHGetSpecialFolderPath(this->GetSafeHwnd(), basePath.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
basePath.ReleaseBuffer();
CString qlPath = basePath + "\\Microsoft\\Internet Explorer\\Quick Launch";

También sería una buena idea verificar hres para asegurarse de que la llamada a SHGetSpecialFolderPath haya sido exitosa.

¿Fue útil?

Solución

AppData en Vista se refiere a C:\Users\xxxx\AppData oaming, no a la carpeta C:\Users\xxxx\AppData en sí.

También este articulo http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx en un sitio de Microsoft implica que simplemente debe usar la ruta relativa a la carpeta appdata

Otros consejos

¡Gran pregunta!

Hagas lo que hagas, no ceder a la tentación de profundizar en el registro para encontrar esta información!

Además, debemos resistir la tentación de codificar algún camino, aunque sea parcialmente.Si obtenemos la ruta especial de AppData, simplemente agregamos una cadena al final, esto puede interrumpirse en instalaciones del software fuera de EE. UU. donde el nombre de la carpeta está localizado en ese idioma.P.ej. GetSpecialFolderPath(APP_DATA) + "\\Fonts" no funcionará en versiones de Windows que no estén en inglés.

Esperemos que alguien tenga la respuesta adecuada a su pregunta;¡Tengo curiosidad por saberlo yo mismo!

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