Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Вниз

Win Api 


ebeden   (2002-01-06 05:32) [0]

Как программно зарегистрировать тип файла в windows (сервис->св-ва папки->типы файлов)?



Dimaond Cat   (2002-01-06 17:12) [1]

Когда-то давно этот unit мне исполнил ГЛУБОКОУВАЖАЕМЫЙ ЮРИЙ ЗОТОВ (который так и не написал мне какой у него теперь адрес хотя обещал)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, registry;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
RichEdit1: TRichEdit;
Label1: TLabel;
Label2: TLabel;
Panel3: TPanel;
Button1: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
public
procedure Open(FileName: string);
procedure Print(FileName: string);
procedure ShowMyMessage(FileName :string);
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
{$R smile.res} //мой файл ресурсов в котором я храню иконку ассоциирующуюся с моими файлами
procedure Tform1.ShowMyMessage(FileName :string);
begin
ShowMessage("Делаем что-то с файлом - " + Filename);
RichEdit1.Lines.LoadFromFile(FileName) ;
end;
procedure TForm1.Open(FileName: string);
begin
// Open(FileName);
RichEdit1.Lines.LoadFromFile(FileName) ;
// Диагностику возможных ошибок делает сама система и VCL. Если файл задан неверно или
// произойдет сбой при чтении, программа получит Exception, а юзер - сообщение.
end;
procedure TForm1.Print(FileName: string);
begin
try
Open(FileName);
// Если файл не загрузился, произойдет переход на finally.
RichEdit1.Print("отпечатано из моей проги") ;
// Showmessage("Print ok");
// Диагностику возможных ошибок делает сама система и VCL. Если при постановке задания
// в очередь на печать или при самой печати произойдет сбой, юзер получит сообщение.
finally
Showmessage("Print ok");
//Halt ;
// Оператор Halt закомментирован только для отладки. Его надо раскомментировать, тогда
// программа сработает невидимо для юзера. Просто появится диалог печати и исчезнет после
// нажатия в нем на на любую кнопку. С точки зрения юзера это и есть печать, а какая
// программа ее исполняет, ему неинтересно.
end ;
end;
procedure TForm1.FormCreate(Sender: TObject);
const
InvalidKey = "Неверный ключ";
var
i: integer;
reg:Treginifile;
begin
reg:=Treginifile.Create("");
reg.RootKey:=HKEY_CLASSES_ROOT;
if reg.readstring(".aaa","","empty")<>"empty" then
begin
button1.Caption:="Снять регистрацию";
Panel3.Caption:="Такое расширение уже зарегистрировано";
reg.Free
end;



Dimaond Cat   (2002-01-06 17:13) [2]

В один присест вся прога не влезла, вот продолжение

(*Будем использовать традиционный формат командной строки:
[Диск:][Путь\]Project1[.exe] [{-|/}{P|p}] [[Диск:][Путь\]Name[.ext]]
где [] - необязательная конструкция, а {} - выбор (| означает "или"). Вместо буквы P,
вообще говоря, может использоваться любая другая - тогда получаем множество команд. В
примере рассматриваем только одну - P(rint).
Это программа SDI и она может работать только с одним файлом. Поэтому командная строка может содержать не более двух параметров (ключ и файл), а если их на самом деле больше,
то лишние игнорируются. Программа MDI могла бы принимать в командной строке любое число открываемых файлов (%1, %2, %3 и т.д.). Можно предусмотреть и задание сразу нескольких ключей, но у нас он всего один. Таким образом, возможны всего 4 варианта запуска нашей программы:
Ключ Файл Наши действия Причина
---------------------------------------------------------------
нет нет Создать файл Клик по самой программе
нет задан Открыть файл Клик по файлу или пункту меню
задан нет Выдать ошибку Ошибочный ручной набор
задан задан Печатать файл Клик по пункту меню
---------------------------------------------------------------
(естественно, ручной набор или запуск из другой программы могут быть причиной в любом случае, а "клик" аналогичен нажатию Enter). В итоге получается, что надо регистрировать две команды:
Открыть: "Диск:\Путь\Project1.exe" "%1" (это будет команда по умолчанию) Печать: "Диск:\Путь\Project1.exe" /p "%1"
При регистрации команд параметр %1 обязательно должен быть в кавычках. Третья команда (Создать: "Диск:\Путь\Project1.exe") выполняется сама собой, при запуске без параметров и поэтому регистрации не требует. Но, если надо, ее можно зарегистрировать для контектного меню папок (аналогично "Создать > Документ Word"). *)
// 1. Заполняем ListBox1 - просто для иллюстрации и отладки, чтобы видеть параметры,
// которые передала система (только из-за этого и закомментирован оператор Halt).
for i := 0 to ParamCount do ListBox1.Items.Add(Format("%d: %s", [i, ParamStr(i)]));
ListBox1.ItemIndex := 0;
// 2. Анализируем параметры командной строки и выполняем нужные действия.
case ParamCount of
1: Open(ParamStr(1));
2: if (ParamStr(1)[1] in ["-", "/"])
then case UpCase(ParamStr(1)[2]) of
"P": Print(ParamStr(2));
"W": ShowMyMessage(ParamStr(2));
else raise Exception.Create(InvalidKey)
end
else raise Exception.Create(InvalidKey) ;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
reg:Treginifile;
begin
reg:=Treginifile.Create( "" );
with reg do begin
RootKey:=HKEY_CLASSES_ROOT;
if readstring(".aaa","","empty")<>"empty" then
begin
EraseSection(".aaa");
// DeleteKey(".aaa","");
EraseSection("myfile");
showmessage("Регистрация снята");
button1.Caption:="Регистрация расширения *.ааa";
Panel3.Caption:="Регистрация нашего типа файлов"
end
else begin
WriteString(".aaa","","myfile");
WriteString("myfile","","мой тип файлов");
WriteString("myfile\DefaultIcon","",application.ExeName+",0");
WriteString("myfile\shell\моя команда Открыть\command","",application.ExeName+" "%1"");
WriteString("myfile\shell\моя команда Печатать\command","",application.ExeName+" /p"+ " "%1"");
WriteString("myfile\shell\Еще одна моя команда\command","",application.ExeName+" /w"+" "%1"");
Writestring("myfile\shell","","моя команда Открыть");
Free;
button1.Caption:="Снять регистрацию";
Panel3.Caption:="Расширение *.aaa зарегистрировано";
Showmessage("ok");
// тут надо вставить update файла регистров чтобы получить мгновенный результат
// в плане присвоения иконки зарегистрированному файлу, а так иконка изменится только
//при перезагрузке компа, но пункты меню уже добавлены и работают без перезапуска компьютера
end;
end;
end;
end.


Если кто-либо расскажет как сделать обновление иконок без перезагрузки компа, то будет просто класс.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.038 c
3-9071            latvija               2002-02-06 14:53  2002.03.04  
Господа програмисты подскажите кто знает .


1-9165            Слава                 2002-02-14 05:48  2002.03.04  
Help,please!


3-9047            iXANiA                2002-02-05 18:44  2002.03.04  
Как отфильтровать таблицу...


4-9343            shur                  2001-12-17 22:14  2002.03.04  
Как убрать стандартные системные часы


1-9125            Геральт               2002-02-15 22:14  2002.03.04  
Вывод различной информации