2010-04-29 7 views
4

Я пытаюсь написать обработчик эскизов Windows Explorer для нашего настраиваемого типа файла. У меня это нормально работает для панели предварительного просмотра, но у меня проблемы с работой над эскизами.Thumbnail Provider не работает

Windows, похоже, даже не пытается вызвать точку входа DllGetClassObject.

Прежде чем продолжить, обратите внимание, что я использую Windows 7 и неуправляемый C++.

Я зарегистрировал следующие значения в реестре:

HKCR\CLSID\<my guid> 
HKCR\CLSID\<my guid>\InprocServer32 (default value = path to my DLL) 
HKCR\CLSID\<my guid>\InprocServer32\ThreadingModel (value = "Apartment") 
HKCR\.<my ext>\shellex\{E357FCCD-A995-4576-B01F-234630154E96} (value = my guid) 

Я также попытался использовать образец Win SDK, и что не работает. А также образец проекта в этой статье (http://www.codemonkeycodes.com/2010/01/11/ithumbnailprovider-re-visited/), и это не сработает.

Я новичок в программировании оболочки, поэтому не уверен, что лучший способ отладки этого. Я попытался подключить отладчик к explorer.exe, но это не работает (точки останова отключены, и ни один из моих OutputDebugStrings не отображается в окне вывода). Обратите внимание, что я попытался установить «DesktopProcess» в реестре, как описано в документах WinSDK для отладки оболочки, но я все еще вижу только один explorer.exe в диспетчере задач, поэтому «может быть», поэтому я не могу отлаживать его ??

Любая помощь с этим была бы принята с благодарностью!

С уважением, Дэн.

ответ

5

Я наткнулся на это, так как вы упомянули мой блог (codemonkeycodes.com).

Какая у вас проблема с моим образцом? Вы зарегистрировали DLL, используя regsvr32? Какую версию Windows 7 вы используете, 32 или 64?


Update:

Я не могу сказать, что это или не работает для вас. Я просто скачал образец с моего сайта, а затем направления и изменения функции STDMETHODIMP CThumbnailProvider :: GetThumbnail ... чтобы выглядеть

{ 
*phbmp = NULL; 
*pdwAlpha = WTSAT_UNKNOWN; 

ULONG_PTR token; 
GdiplusStartupInput input; 
if (Ok == GdiplusStartup(&token, &input, NULL)) 
{ 
    //gcImage.LogBuffer(); 
    Bitmap * pBitmap = new Bitmap(188, 141); 
    if(pBitmap) 
    { 
     Color color(0, 0, 0); 
     pBitmap->GetHBITMAP(color, phbmp); 
    } 
} 

GdiplusShutdown(token); 

if(*phbmp != NULL) 
    return NOERROR; 

return E_NOTIMPL; 
} 

Я зарегистрировал DLL, а затем создал новый файл с соответствующим расширением, и тада, у меня был красивый черный эскиз.

Хотел бы я помочь. Может быть, вы хотите отправить мне свой код?

+0

Hi. Я использую x64 Windows7. Поскольку это не только ваш образец, который не работает для меня - это как образцы MS, так и мой собственный код, который также не работает - я предполагаю, что есть что-то еще. Поскольку я новичок в программировании Windows (мой опыт работы с приложением и разработкой игр), я не знаю, как лучше всего отлаживать его. Я попытался подключить мой отладчик (MS VS 2005) к explorer.exe, но я не вижу ни одного из моих журналов трассировки. – Dan

+0

Глупый вопрос, и я уверен, что вы этого не упустили, но зарегистрировали ли вы DLL с 64-битной версией regsrv32? – Jeremy

+0

Да, я явно набрал в \ windows \ system32 \ regsvr32.exe. Знаете ли вы, в какой момент Windows должна вызывать функцию DllGetClassObject? Было бы полезно узнать, добирается ли он туда. – Dan

1

У меня точно такая же проблема. Я не могу сделать SDK или любой образец работы. Мне нужен образец COM, потому что я должен позвонить Microsoft.Jet.OLEDB.4.0, который работает только на 32-битной системе.

Я не смог сделать эту работу:link

Это работает, если AnyCPU задается при компиляции.Брус сделать это работает на x86:link

Это было хорошо под XP работает как шарм:link

Это шоу Adobe были проблемы с миниатюрами МС с Office 2007 (32 бита):link