Shell Extension

0

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ę.

0

Po kawalku okienka wyglada mi to na system >= Vista. Wtedy nalezy uzyc IThumbnailProvider zamiast IExtractImage.

0

IExtractImage też jest wspierane przez Vistę. Widzę też w rejestrze, że handler od IExtractImage również występuje.

Ale spróbuję zaimplementować jeszcze IThumbnailProvider.

Note, that existing code that uses IExtractImage is still valid under Windows Vista.

To z MSDN.

Muszę powiedzieć, że raz zadziałało.. ustawiłem najpierw dla plików .avi i działało dla.. jedynego pliku. Jeden, jedyny plik, pierwszy odcinek Big Bang Theory...

Teraz znowu nic. I dla plików .xyz nie działa dalej..

0

No dobra, działa. Po prostu wystarczyło zmodyfikować plik, żeby Windows wyczyścił cache i jeszcze raz wygenerował miniaturkę...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.