2008-09-16 13 views
1

VistaとXPの両方で、すべてのユーザーと現在のユーザーの両方に対してクイック起動フォルダを確実に取得する必要があります。私はC++で開発していますが、これはWindows APIの一般的な質問です。私は、これはサブフォルダMicrosoftが使用する知っているだけの問題である疑いがあるXPとVistaでQuick Launchフォルダを確実に取得するにはどうすればよいですか?

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

は参考のため、ここでは両方のシステムの下で、Application Dataフォルダを取得するためのコードです。 Windows XPでは、アプリのデータサブフォルダの下

がある:Vistaで

のMicrosoft \ Internet Explorerの\クイック起動

、サブフォルダに変更されたことが表示されます:ローミング

\ Microsoft \ Internet Explorer \ Quick Launch

しかし、これが正しい場所を判断する正しい方法であることを確認したいと思います。 ...など、あなたが国際的なインストールに移動すると、ほとんどの場合、ハードコーディングされたフォルダ名を頼ることは壊れるとしてこの場所を決定する正しい方法は、非常に重要であるフォルダがで「ローミング」という名前が付けられているという事実を発見

Vistaでは、そのフォルダに関連する特別な処理があるかどうか疑問に思う。(XPのLocal Settingsフォルダに似ている)

EDIT: 次のMSDNの記事:\ Users \ユーザーXXXX \のAppData \ローミング、それは可能なはずですので:http://msdn.microsoft.com/en-us/library/bb762494.aspxはCSIDL_APPDATAはCを返しないことStocksRの主張を支持しているように見えるんどの、CSIDL_APPDATAはFOLDERID_RoamingAppDataの同等のIDを持っていることを示していますCSIDL_APPDATAの同じ相対パスを使用してクイック起動(\ Microsoft \ Internet Explorer \ Quick Launch)を取得します。

したがって、次のアルゴリズムは、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"; 

、また、SHGetSpecialFolderPathの呼び出しが成功したことを確認するためにHRESをチェックするために良いでしょう。

答えて

1

グレート質問への相対パスを使用する必要があることを意味します!

あなたが何をしても、は誘惑にこの情報を見つけるためにdig into the registryに与える!

また、一部のパスをハードコードするという誘惑にも抵抗する必要があります。特別なAppDataパスを取得してから最後に文字列を追加するだけで、フォルダ名がその言語にローカライズされている場合、ソフトウェアのUS以外のインストールで破損する可能性があります。例えば。 GetSpecialFolderPath(APP_DATA) + "\\Fonts"は英語以外のバージョンのWindowsでは動作しません。

誰かがあなたの質問に対して適切な答えを持っていたらうれしいです。私はそれを自分で知ることが好奇妙です!

関連する問題