Witam.
Próbuję napisać proste shell extension do generowania miniaturek.
Przeczytałem, że służy do tego interfejs IExtractImage, więc znalazłem go na p/invoke.
[ComVisible(true)]
[Guid("4D6E51DF-E250-4765-934D-3F251DBD26BC")]
[ClassInterface(ClassInterfaceType.None)]
public class MovieThumbnails : Win32.IExtractImage
{
string filePath;
#region IExtractImage Members
public long GetLocation(StringBuilder pszPathBuffer, int cch, ref int pdwPriority, ref Win32.SIZE prgSize, int dwRecClrDepth, ref int pdwFlags)
{
System.Windows.Forms.MessageBox.Show("test");
filePath = pszPathBuffer.ToString();
return 0;
}
public int Extract(IntPtr phBmpThumbnail)
{
System.Windows.Forms.MessageBox.Show("test2");
return 0;
}
#endregion
[ComRegisterFunctionAttribute()]
static void RegisterServer(String str1)
{
try
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", true);
registryKey.SetValue("{4D6E51DF-E250-4765-934D-3F251DBD26BC}", "Movie Thumbnails");
registryKey.Close();
registryKey = Registry.ClassesRoot.CreateSubKey(@".xyz\ShellEx\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}");
registryKey.SetValue("", "{4D6E51DF-E250-4765-934D-3F251DBD26BC}");
registryKey.Close();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
}
W ustawieniach projektu w Visual Studio zaznaczyłem "Register for COM Interop".
Gdy skompiluję, ubiję proces explorera, uruchomię go ponownie, dołączę się z debuggerem do explorer.exe, uruchomię widok katalogu z plikiem xyz, nic się nie dzieje. Ani nie wyświetla się komunikat, ani nie zaskakują breakpointy, ani nawet nie zawiesza się explorer, bo nie są zaimplementowane metody.
http://img102.imageshack.us/img102/9152/49822398.jpg
Tutaj fakt, że Visual Studio faktycznie zarejestrował bibliotekę.