Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ассоциация файлов


Автор: Racer 11.8.2009, 11:53
Здравствуйте, форумчане.

Я делаю плеер и хочу добавить ассоциацию файлов которые он поддерживает к нему. Тоесть при нажатии на *.mp3 и так далее открывается мой плеер и весело играет тот музончик. Я изготовил другой проект для испытаний. Сначала добавил в реестр данные о новом формате (я испытывал методу на новом формате *.myext). 
Код

procedure TForm1.btn1Click(Sender: TObject);
var
R : TRegIniFile;
begin
R := TRegIniFile.Create('');
with R do begin
RootKey := HKEY_CLASSES_ROOT;
WriteString('.myext','','MyExt');
WriteString('MyExt','','Some description of MyExt files');
WriteString('MyExt\DefaultIcon','','C:\MyApp.Exe,0');
WriteString('MyExt\Shell','','This_Is_Our_Default_Action');
WriteString('MyExt\Shell\First_Action','','This is our first action');
WriteString('MyExt\Shell\First_Action\command','',
'D:\Project_Reg.Exe /LotsOfParamaters %1');
WriteString('MyExt\Shell\This_Is_Our_Default_Action','',
'This is our default action');
WriteString('MyExt\Shell\This_Is_Our_Default_Action\command',
'','D:\Project_Reg.Exe %1');
WriteString('MyExt\Shell\Second_Action','','This is our second action');
WriteString('MyExt\Shell\Second_Action\command',
'','D:\Project_Reg.Exe /TonsOfParameters %1');
Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 if (paramstr(1) <> '') then ShowMessage(paramstr(1));
end;


Но при открытии нескольких файлов такого типа запускается 2 копии моего приложения. Как это исправить?

Автор: Keeper89 11.8.2009, 12:11
Прочитайте вот это (может где и на русском есть, не искал):
  • http://delphi.about.com/od/adptips2006/qt/activaterunning.htm
  • http://delphi.about.com/od/adptips2006/qt/appextension.htm
  • http://delphi.about.com/od/windowsshellapi/l/aa100703a.htm
  • http://delphi.about.com/b/2005/01/10/exchanging-data-between-two-applications.htm

Смысл всего в нескольких шагах:
1) Создании мьютекса при старте первого экземпляра и регистрация определенного сообщения для передачи пути к файлу;
2) При запуске второго экземпляра - определение, что приложение уже запущено, передача зарезервированного сообщения с путем к файлу и закрытие второго экземпляра.

З.Ы. Примеры есть в приведенных ссылках.

Автор: Racer 11.8.2009, 14:44
А можно теперь мне по русски? Вроде все понятно, но что именно делать мне? инструкцию поподробней и код, плиз, можете дать?

Автор: Keeper89 11.8.2009, 17:44
Было время, повозился - прикрепляю образец.

Автор: Racer 11.8.2009, 21:25
Спасибо, попробую потом отпишусь обязательно

Автор: sector19 25.8.2009, 05:57
Keeper89, Ваш пример мне очень помог! Спасибо!  smile 

Автор: Racer 25.8.2009, 11:15
Keeper89, у меня почему-то не получается. Скопировал все из примера, изменил только на мою форму (там, в мютексе), но когда открываю файлы через плеер то выкидывает мессагу: Access violation at adress 0051AE31in module 'Walkman.exe'. Read of adress 00000360.
Что это такое? И как исправить???

Код

program Walkman;

uses
  Forms,
  Windows,
  SysUtils,
  Messages,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit4 in 'Unit4.pas' {Form4},
  Unit5 in 'Unit5.pas' {Form5},
  uSenderMain in 'uSenderMain.pas';

{$R *.res}

var
  Mutex, PreviousHandle: THandle;
  i: Integer;

begin
  Mutex := CreateMutex(nil, True, 'Form1');
  if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    PreviousHandle := FindWindow('Form1', Nil);
    for i := 1 to ParamCount do
      if FileExists(ParamStr(i)) then
        SendPath(ParamStr(i), PreviousHandle);
    SetForegroundWindow(PreviousHandle);
  end
  else
  begin
   Application.Initialize;
   Application.MainFormOnTaskbar := True;
   Application.CreateForm(TForm1, Form1);
   Application.CreateForm(TForm2, Form2);
   Application.CreateForm(TForm4, Form4);
   Application.CreateForm(TForm5, Form5);
   Application.Run;
  end;
end.
 

Код

formcreate  
. . .
 for o := 1 to ParamCount do
    if FileExists(ParamStr(i)) then
      Form2.ListBox1.Items.Add(ParamStr(i));

Автор: CodeMonkey 25.8.2009, 11:24
http://gunsmoker.blogspot.com/2009/05/access-violation.html.

Добавлено через 2 минуты и 45 секунд
А за HKEY_CLASSES_ROOT http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=72363. Чтоб запоминали ;)

Автор: Racer 25.8.2009, 13:34
Цитата

А за HKEY_CLASSES_ROOT надо бить в лицо без предупреждения. Чтоб запоминали ;)

Не понял ,это еще за что?? Я ведь просто хочу слушать музыку в своем плеере.

Автор: Racer 26.8.2009, 13:30
Ну помогите!!!!!!!!!1 smile 

Автор: Keeper89 26.8.2009, 14:14
Цитата(Racer @  25.8.2009,  14:34 Найти цитируемый пост)
Не понял ,это еще за что?? Я ведь просто хочу слушать музыку в своем плеере.

CodeMonkey дал ссылку - почему.
Цитата(Racer @  26.8.2009,  14:30 Найти цитируемый пост)
Ну помогите!!!!!!!!!1 smile  

В какой строке выдается Access violation?

Автор: Racer 27.8.2009, 14:48
А как мне понять в какой строке выдается Аccess violation? Если я нажимаю открыть с помощью -> плеер, тоесть не запускаю его в отладчике?

Автор: CodeMonkey 27.8.2009, 15:42
http://delphikingdom.ru/asp/viewitem.asp?catalogid=1392.

Вы бы сперва среду освоили, отладчик хотя бы по минимуму - а уж потом писали бы программы.

Hint: Run/Parameters или Search/Goto address.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)