|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Программная ассоциация файлов с моей программой
Есть программа, хочу что бы определённые расширения файлов, по двойному клику по ним, открывались в моей программе.
В ручную это - пкм по файлу, свойства, вкладка общее, кнопка изменить и выбор программы.. В программе есть лист бокс, в нем я записываю все расширения, которые должны открываться в моей программе. По кнопке происходит цикл и расширения ассоциируются с программой. Проблема в автоматической ассоциации.. Знаю что в реестре, знаю что это не в HKEY_CLASSES_ROOT а HKEY_CURRENT_USER\Software\Classes\ Только вот ничего не получается, расширения не ассоциируются с программой. Помогите, что делаю не так? Код:
Function asss(Const Ext, ExeName: String): Boolean; begin with TRegistry.Create do try RootKey := HKEY_CURRENT_USER; if OpenKey('\Software\Classes\.'+ Ext, TRUE) then WriteString('', ExeName); if OpenKey('\Software\Classes\ProText', TRUE) then WriteString('', 'My Very Own Text File Type'); if OpenKey('\Software\Classes\ProText\DefaultIcon', TRUE) then WriteString('', ExtractFilePath(ParamStr(0)) + ExeName); if OpenKey('\Software\Classes\ProText\shell\open\command', TRUE) then WriteString('', ExtractFilePath(ParamStr(0)) + ExeName + '"%1"'); finally Free; end; SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); end; зы ProText - название exe моей программы win7 64, delphi 10.3 Последний раз редактировалось Gareth, 29.08.2022 в 22:28. |
#2
|
|||
|
|||
бинарник 32 бита?
Таи, вроде, были заморочки, что для 32 битных бинарников своя копия реестра. Вроже, если пишешь в HKEY_LOCAL_MACHINE, то будет работать,а вот с HKEY_CURRENT_USER какие-то заморочки. ЗЫ. Я отказался от регистрации ассоциаций из самого экзешника в пользу регистрации при инсталяции. Пользуюсь InnoSetup. Он делает все правильно. ЗЗЫ. По коду. А кто будет закрывать ключи за тобой. Можнт потому и не работает? ЗЗЫ2. Расширение с точкой передаешь? Типа ".txt"? ЗЗЫ3. А, кажется понял почему не работает. Смотри вот этот пример внимательно: https://stackoverflow.com/questions/...e-current-user В первом ключе надо писать не имя экзешника, а имя программы, т.е. в твоем случае "ProText" Далее, что за извращение в строке 11 и 13? ParamStr(0) уже дает тебе полный путь к бинарнику. В строке 13, вроде, пробела не хватает (разделение имени бинарника и параметра). |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Gareth (30.08.2022)
|
#3
|
|||
|
|||
Цитата:
Код:
Function asss(Const Ext, ExeName: String): Boolean; begin with TRegistry.Create do try RootKey := HKEY_CURRENT_USER; if OpenKey('\Software\Classes\.'+ Ext, TRUE) then WriteString('', 'ProText'); if OpenKey('\Software\Classes\ProText', TRUE) then WriteString('', 'My Very Own Text File Type'); if OpenKey('\Software\Classes\ProText\DefaultIcon', TRUE) then WriteString('', ParamStr(0)); if OpenKey('\Software\Classes\MyAppDataFile\shell\open\command', TRUE) then WriteString('', ParamStr(0) + ' "%1"'); finally Free; end; SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); end; Наверно проще будет сказать, что в реестре должно появится и по какому пути... Я просто не понимаю саму суть этого всего.. Вот что в реестре: |
#4
|
|||
|
|||
так же скачал pas файл DSiWin32.pas
В нем уже есть функция ассоциации файлов... Пытаюсь ассоциировать - результат тот же, ассоциация не меняется, даже после перезагрузки пк. Код:
DSiRegisterUserFileAssoc('cfg', 'ProText', 'MyProText', ParamStr(0), ParamStr(0) + ' "%1"'); |
#5
|
|||
|
|||
Строка 12.
Должна быть \Software\Classes\ProText\shell\open\command |
#6
|
|||
|
|||
Цитата:
скачал программу которая отслеживает все изминения в реестре.. В ручную менял программу по умолчанию для расширения, смотрел что изменилось в реестре - пытался сделать тоже самое через delphi - безрезультатно. |
#7
|
|||
|
|||
Ну не знаю что у тебя там не работает.
Вот для D10.2 у меня все ок - регистрирует, при клике - открывает: Код:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) btRegister: TButton; lbFileName: TLabel; edFileText: TMemo; procedure btRegisterClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses System.Win.Registry, ShlObj; procedure TForm1.btRegisterClick(Sender: TObject); const sKeyRoot = '\Software\Classes\'; sExt = '.protxt'; sAppName = 'ProText'; var R : TRegistry; begin R := TRegistry.Create; Try R.RootKey := HKEY_CURRENT_USER; If R.OpenKey(sKeyRoot+sExt,True) Then Begin R.WriteString('',sAppName); R.CloseKey; End; If R.OpenKey(sKeyRoot + sAppName,True) Then Begin R.WriteString('',sAppName + ' file type'); R.CloseKey End; If R.OpenKey(sKeyRoot + sAppName + '\DefaultIcon',True) Then Begin R.WriteString('','"' + ParamStr(0) + '",0'); R.CloseKey; End; If R.OpenKey(sKeyRoot + sAppName + '\shell\open\command',True) Then Begin R.WriteString('','"' + ParamStr(0) + '" "%1"'); R.CloseKey; End; SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); Finally R.Free; End; end; procedure TForm1.FormCreate(Sender: TObject); begin If ParamCount > 0 Then Begin lbFileName.Caption := ParamStr(1); edFileText.Lines.LoadFromFile(ParamStr(1)); End; end; end. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Gareth (10.01.2023)
|