Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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.


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



Страницы: 1 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.005 c
1-9239
Андре
2002-02-15 19:22
2002.03.04
The Bat !


4-9338
Ted
2002-01-03 10:38
2002.03.04
Alt+f4


1-9206
sammy
2002-02-12 08:31
2002.03.04
прога в ram


14-9280
Феликс
2002-01-14 22:03
2002.03.04
А у вас глючил Делфи?


4-9345
Вадим
2002-01-03 16:19
2002.03.04
Ничего не понимаю





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский