2008-08-31 16 views
3

私は、特別なフォルダ、特にごみ箱のローカライズされた名前を見つけるための '正しい' Windows APIを見つけようとしています。適切にローカライズされたダイアログボックスを表示して、ごみ箱にファイルを送信するか、直接削除するかを尋ねるダイアログボックスを表示するようにしたいと考えています。「特別な」Windowsフォルダ(ごみ箱など)のローカライズされた名前を取得するにはどうすればよいですか?

私は実際の削除を行う方法について、インターネット上(およびStackoverflow)で多くを見つけました。それは十分に単純なようです。テキストをローカライズできるようにしたいだけです。

答えて

2

コードサンプルと使用方法については、この記事を読む:

http://www.codeproject.com/KB/winsdk/SpecialFolders.aspx

また、私は実際にそう、CodeProjectの記事がひどく役に立たなかったあなたにIdentify the Location of Special Folders with API Calls

+0

コードプロジェクトコードは、この情報をどのように取得するのがすばらしいかを実証しています。私はStrRetToStr(...)を使用して、JNIがJavaで使用できる形式で戻り値を取得する必要がありましたが、それは十分に簡単でした。 –

+0

@FreeWildebeest:コードプロジェクトコードを使用して、「特別な」フォルダのローカライズされた名前を取得しましたか?私はこれをgovenコードにつなげることができません。実行中のexeファイルでも表示されません。フォルダパスを指定すると、特殊なフォルダの場合はローカライズされた名前を取得しようとしています。 – Oliver

0

を助けMSDNの記事があります私は、私がごみ箱のローカライズされた名前を取得するために使用した実際のコードでこの質問に答えると思った。

このサンプルでは、​​リソースを解放するために正しく動作するようにも試みます。すべてのコメントは歓迎します。特に、私のリソース管理でエラーが見つかった場合

public static string GetLocalizedRecycleBinName() 
{ 
    IntPtr relative_pidl, parent_ptr, absolute_pidl; 

    PInvoke.SHGetFolderLocation(IntPtr.Zero, PInvoke.CSIDL.BitBucket, 
     IntPtr.Zero, 0, out absolute_pidl); 
    try 
    { 
     PInvoke.SHBindToParent(absolute_pidl, 
      ref PInvoke.Guids.IID_IShellFolder, 
      out parent_ptr, out relative_pidl); 
     PInvoke.IShellFolder shell_folder = 
      Marshal.GetObjectForIUnknown(parent_ptr) 
      as PInvoke.IShellFolder; 
     // Release() for this object is called at finalization 
     if (shell_folder == null) 
     return Strings.RecycleBin; 

     PInvoke.STRRET strret = new PInvoke.STRRET(); 
     StringBuilder sb = new StringBuilder(260); 
     shell_folder.GetDisplayNameOf(relative_pidl, PInvoke.SHGNO.Normal, 
      out strret); 
     PInvoke.StrRetToBuf(ref strret, relative_pidl, sb, 260); 
     string name = sb.ToString(); 

     return String.IsNullOrEmpty(name) ? Strings.RecycleBin : name; 
    } 
    finally { PInvoke.ILFree(absolute_pidl); } 
} 

static class PInvoke 
{ 
    [DllImport("shell32.dll")] 
    public static extern int SHGetFolderLocation(IntPtr hwndOwner, 
     CSIDL nFolder, IntPtr hToken, uint dwReserved, out IntPtr ppidl); 

    [DllImport("shell32.dll")] 
    public static extern int SHBindToParent(IntPtr lpifq, [In] ref Guid riid, 
     out IntPtr ppv, out IntPtr pidlLast); 

    [DllImport("shlwapi.dll")] 
    public static extern Int32 StrRetToBuf(ref STRRET pstr, IntPtr pidl, 
     StringBuilder pszBuf, uint cchBuf); 

    [DllImport("shell32.dll")] 
    public static extern void ILFree([In] IntPtr pidl); 

    [ComImport] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("000214E6-0000-0000-C000-000000000046")] 
    public interface IShellFolder 
    { 
     [PreserveSig] 
     Int32 CompareIDs(Int32 lParam, IntPtr pidl1, IntPtr pidl2); 
     void ParseDisplayName(IntPtr hwnd, IntPtr pbc, String pszDisplayName, 
      UInt32 pchEaten, out IntPtr ppidl, UInt32 pdwAttributes); 
     void EnumObjects(IntPtr hwnd, int grfFlags, 
      out IntPtr ppenumIDList); 
     void BindToObject(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, 
      out IntPtr ppv); 
     void BindToStorage(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, 
      out IntPtr ppv); 
     void CreateViewObject(IntPtr hwndOwner, [In] ref Guid riid, 
      out IntPtr ppv); 
     void GetAttributesOf(UInt32 cidl, 
      [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] 
     IntPtr[] apidl, ref uint rgfInOut); 
     void GetUIObjectOf(IntPtr hwndOwner, UInt32 cidl, 
      [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] 
     IntPtr[] apidl, [In] ref Guid riid, UInt32 rgfReserved, 
     out IntPtr ppv); 
     void GetDisplayNameOf(IntPtr pidl, SHGNO uFlags, out STRRET pName); 
     void SetNameOf(IntPtr hwnd, IntPtr pidl, string pszName, 
      int uFlags, out IntPtr ppidlOut); 
    } 

    public enum CSIDL 
    { 
     BitBucket = 0x000a, 
    } 

    public enum SHGNO 
    { 
     Normal = 0x0000, ForParsing = 0x8000, 
    } 

    [StructLayout(LayoutKind.Explicit, Size = 520)] 
    public struct STRRETinternal 
    { 
     [FieldOffset(0)] public IntPtr pOleStr; 
     [FieldOffset(0)] public IntPtr pStr; 
     [FieldOffset(0)] public uint uOffset; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct STRRET 
    { 
     public uint uType; 
     public STRRETinternal data; 
    } 

    public class Guids 
    { 
     public static Guid IID_IShellFolder = 
      new Guid("{000214E6-0000-0000-C000-000000000046}"); 
    } 
} 
関連する問題