К примеру, надо добавить thumbnail provider для flv файла:
Простенький проект, который будет рисовать эскизы в проводнике для flv файлов (ахтунг, для висты! в хр используется другой интерфейс для показа эскизов):
- сначала надо в HKEY_CLASSES_ROOT найти нужное расширение файла (.flv)
- если нашли - читаем значение по умолчанию для ветки (KMPlayer например после добавления воспроизведения flv файлов на себя обозвал такие файлы как flv_auto_file)? если нет - создаем ветку и придумываем название для такого типа файлов, записывая его в значение по умолчанию для ветки
- теперь надо открыть (или создать) в HKEY_CLASSES_ROOT ветку, значение которой прочитали (flv_auto_file), и
- проверить, есть ли в ней ветка Shell (потому что если ее нет, то даже если все остальное правильно, все равно ничего работать не будет... по крайней мере для эскизов я точно об этом знаю)
- в ветке ShellEx добавить ветку с guid-ом нужного обработчика (например для обработчика эскизов - {E357FCCD-A995-4576-B01F-234630154E96}), и записать в значение по умолчанию guid сом-обьекта, который собственно и будет создавать эскизы
- для красоты можно записать в ветку flv_auto_file ключик Treatment - в висте он будет дорисовывать рамочку вокруг эскиза; например рамка в виде кадра кинопленки - значение 3.
- вообще говоря не относится к регистрации особо, но - если провайдер эскизов реализует интерфейс IInitializeWithFile, то в HKEY_CLASSES_ROOT\CLSID\provider_guid надо добавить ключик DisableProcessIsolation со значением 1
Простенький проект, который будет рисовать эскизы в проводнике для flv файлов (ахтунг, для висты! в хр используется другой интерфейс для показа эскизов):
library vista_thumb;
uses
ComServ,
thumbProvider_impl in 'thumbProvider_impl.pas';
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.RES}
begin
end.
unit thumbProvider_impl;
interface
uses
windows, graphics, sysutils,
ActiveX, ComObj, registry, propsys;
const
CLSID_ThumbProvider: TGUID = '{C8F39152-17CA-42F9-9FC0-4499C6D74C92}';
type
TThumbProvider2 = class (TComObject, IInitializeWithFile, IThumbnailProvider)
public
function IInitializeWithFile.Initialize = Initialize1;
function Initialize1 (pszFilePath: LPCWSTR; grfMode: DWORD): HRESULT; stdcall;
function GetThumbnail(cx: Cardinal; out phbmp: HBITMAP; out pdwAlpha: Cardinal): HRESULT; stdcall;
end;
implementation
uses
ComServ, ShlObj;
type
TThumbProviderFactory = class (TComObjectFactory)
procedure UpdateRegistry (Register: Boolean); override;
end;
{ TThumbProviderFactory }
procedure TThumbProviderFactory.UpdateRegistry(Register: Boolean);
const
shell_path = 'Shell';
shellex_thumbnail = 'ShellEx\{E357FCCD-A995-4576-B01F-234630154E96}';
var
reg: TRegistry;
base_path: string;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_CLASSES_ROOT;
if Register then
begin
inherited UpdateRegistry (Register);
reg.OpenKey ('.flv', true);
try
if reg.ValueExists ( '' ) then
base_path := reg.ReadString ( '' )
else
base_path := 'flv_auto_file';
finally
reg.CloseKey;
end;
reg.OpenKey ( base_path, true );
try
if not reg.KeyExists ( shell_path ) then
reg.CreateKey ( shell_path );
finally
reg.CloseKey;
end;
reg.OpenKey ( base_path, false );
try
reg.WriteInteger ('Treatment', 3);
finally
reg.CloseKey;
end;
if reg.OpenKey (base_path + '\' + shellex_thumbnail, true) then
try
reg.WriteString ('', GUIDToString (CLSID_FlashFilesThumbProvider));
finally
reg.CloseKey;
end;
if reg.OpenKey ( 'CLSID\' + GUIDToString (CLSID_FlashFilesThumbProvider), false ) then
try
reg.WriteInteger ('DisableProcessIsolation', 1);
finally
reg.CloseKey;
end;
end else begin
reg.DeleteKey (base_path + '\' + shellex_thumbnail);
inherited UpdateRegistry (Register);
end;
SHChangeNotify ( SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil );
finally
reg.Free;
end;
end;
{ TThumbProvider2 }
function TThumbProvider2.GetThumbnail(cx: Cardinal; out phbmp: HBITMAP; out pdwAlpha: Cardinal): HRESULT;
var
bmp: TBitmap;
begin
Result := E_FAIL;
bmp := TBitmap.Create;
try
bmp.Width := cx; bmp.Height := cx div 2;
bmp.PixelFormat := pf32bit;
with bmp.Canvas do
begin
Brush.Color := clFuchsia;
FillRect (ClipRect);
TextOut (5, 5, format ('%d', [cx]));
TextOut (5, 25, 'fuck U!');
end;
phbmp := bmp.Handle;
bmp.ReleaseHandle;
pdwAlpha := WTSAT_RGB;
Result := S_OK;
finally
bmp.free;
end;
end;
function TThumbProvider2.Initialize1 (pszFilePath: LPCWSTR; grfMode: DWORD): HRESULT;
begin
Result := S_OK;
end;
initialization
TThumbProviderFactory.Create (ComServer, TThumbProvider2,
CLSID_ThumbProvider, 'Thumbnail provider for Flash files',
'', ciMultiInstance, tmApartment);
end.
is it posible to get the sorcecode. i can't seem to get it to work
ОтветитьУдалитьhttp://fat-hamster.blogspot.com/2009/05/blog-post.html
ОтветитьУдалить