Файловые ассоциации - Не все так просто как кажется
Приветствую, помогите реализовать задачу: необходимо мою программу UnMaskFile добавить в контекстное меню всех файлов в системе, перерыл многое, в результате нашел, что якобы это реализуется через написание соответствующей библиотеки, так ли это и нет ли у кого примера?
Вот мой юнит, собранный на основе информации с форумов, для ассоциации программы с указанным типом:
Код:
unit Assoc;//Warning Assoc Replaced
interface
uses
Registry, ShlObj, SysUtils, Windows;
function RegisterFileType(cMyExt, cMyFileType, cMyDescription, cMyText,
ExeName: string; IcoIndex: integer; DoUpdate: boolean = True;
cHKEY: HKEY = HKEY_CLASSES_ROOT): boolean;
procedure SimpleCreateAssoc(cMyExt, cMyText, ExeName: string);
implementation
// HKEY_LOCAL_MACHINE\Software\Classes
// HKEY_CURRENT_USER\Software\Classes -> for Vista & 7
function RegisterFileType(cMyExt, cMyFileType, cMyDescription, cMyText,
ExeName: string; IcoIndex: integer; DoUpdate: boolean = True;
cHKEY: HKEY = HKEY_CLASSES_ROOT): boolean;
var
Reg: TRegistry;
Ext: String;
begin
RESULT := FALSE;
//
Reg := TRegistry.Create;
try
Reg.RootKey := cHKEY;
//
Ext := cMyExt;
if Ext[1] <> '*' then
begin
if Ext[1] <> '.' then
Ext := '.' + Ext;
end;
//
if (cHKEY = HKEY_LOCAL_MACHINE) or (cHKEY = HKEY_CURRENT_USER) then
Ext := 'Software\Classes\' + Ext;
//
if Reg.OpenKey(Ext, True) then
begin
Reg.WriteString('', cMyFileType); // ExeFile or EXE.MyApp
Reg.CloseKey;
end;
//
if Reg.OpenKey(cMyFileType, True) then
begin
Reg.WriteString('', cMyDescription);
Reg.CloseKey;
end;
//
if Reg.OpenKey(cMyFileType + '\DefaultIcon', True) then
begin
Reg.WriteString('', AnsiQuotedStr(ExeName, '"') + ',' + IntToStr(IcoIndex)
);
// or:
// Reg.WriteString('', AnsiQuotedStr(ExeName + ',' + IntToStr(IcoIndex), '"'));
Reg.CloseKey;
end;
//
if Reg.OpenKey(cMyFileType + '\Shell\Open', True) then
begin
Reg.WriteString('', cMyText); // &Open
Reg.CloseKey;
end;
//
if Reg.OpenKey(cMyFileType + '\Shell\Open\Command', True) then
begin
Reg.WriteString('', AnsiQuotedStr(ExeName, '"') + ' "%1"');
Reg.CloseKey;
RESULT := True;
end;
//
if DoUpdate then
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
//
finally
Reg.Free;
end;
end;
procedure SimpleCreateAssoc(cMyExt, cMyText, ExeName: string);
begin
RegisterFileType(cMyExt, cMyExt + 'file', '', cMyText,
ExeName, 0, True, HKEY_CLASSES_ROOT);
RegisterFileType(cMyExt, cMyExt + 'file', '', cMyText,
ExeName, 0, True, HKEY_LOCAL_MACHINE);
RegisterFileType(cMyExt, cMyExt + 'file', '', cMyText,
ExeName, 0, True, HKEY_CURRENT_USER);
end;
end.
|