ファイル拡張子のアイコンをdllで扱い、Windowsエクスプローラーでファイルの内容に合わせてアイコンを付けたい(PSDファイルのサムネイルアイコンのようなもの。Photoshopは.psd拡張子を扱い、ファイルごとにサムネイルを生成する)
私はC#でうまく処理Load
してGetIconLocation
機能するdllを作成しました。WindowsはExtract
後で関数を呼び出す必要があるようGetIconLocation
ですが、そうではありません!
インターフェース:
[ComVisible(true), ComImport, Guid("000214eb-0000-0000-c000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IExtractIcon
{
[PreserveSig]
uint GetIconLocation(int uFlags, IntPtr szIconFile, int cchMax, IntPtr piIndex, UIntPtr pwFlags);
//[PreserveSig]
//uint GetIconLocation(uint uFlags, IntPtr szIconFile, uint cchMax, IntPtr piIndex, UIntPtr pwFlags);
[PreserveSig]
uint Extract(string pszFile, uint nIconIndex, ref IntPtr phiconLarge,ref IntPtr phiconSmall, uint nIconSize);
}
そして機能:
public uint Load(string pszFileName, uint dwMode)//Using IPersistFile
{
icon_File = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Icon.bmp");
tip = "My tool-tip";
Logger.WriteLog("Load :"+pszFileName+" , "+dwMode.ToString());
return S_OK;
}
public uint GetIconLocation(int uFlags, IntPtr szIconFile, int cchMax, IntPtr piIndex, UIntPtr pwFlags)//Using IExtractIcon and IPersistFile.Load
{
try
{
IconHandlerReturnFlags Flags;
Flags = IconHandlerReturnFlags.PerClass | IconHandlerReturnFlags.DontCache | IconHandlerReturnFlags.NotFilename;
pwFlags = (UIntPtr)Flags;
Logger.WriteLog("GetIconLocation...");
return S_OK;
}
catch (Exception e)
{
Logger.WriteLog("GetIconLocation " + e.Message);
return S_FALSE;
}
}
public uint Extract(string pszFile, uint nIconIndex, ref IntPtr phiconLarge,ref IntPtr phiconSmall, uint nIconSize)//Using IExtractIcon
{
Logger.WriteLog("Extract...");
// other code...
}
Load
関数は正しく機能し、正しいファイル名を提供します。また、GetIconLocation
動作します。しかし、S_OK 値が返された後、Extract は実行されません...:(
.myf
これは、 Windows エクスプローラーで 2 つのファイル アイコンを表示した後のログです。
Load : C:\**********1.Myf , 0
GetIconLocation...
Load : C:\**********2.Myf , 0
GetIconLocation...
Load : C:\**********1.Myf , 0
GetIconLocation...
GetIconLocation...
Load : C:\**********1.Myf , 0
GetIconLocation..
(時々 2GetIconLocation
なしで呼び出しますLoad
)
誰か助けてください……。