Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зарегистрировать свой тип файлов 
:(
    Опции темы
Нитонисе
Дата 30.10.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Надо зарегистрировать свой тип файлов. Суть его - заполнение некоторых исходных данных для моей программы. Наборы исходных данных могут быть разные - потому хотелось бы иметь возможность сохрнаять их в файл, и загружать снова. При этом хотелось бы зарегистрировать для своего расширения особый значок для файлов. и совсем хорошо было бы если б содержимое файла нельзя было просмотреть различного рода просмотрщиками (то есть надо чтоб информация там искажалась). 
Как все это можно сделать? Если не трудно поясните, а если трудно - дайте ссылку на ресурсы, где об этом можно почитать.
PM MAIL   Вверх
Alexeis
Дата 30.10.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Для Vista+ это делается при помощи COM объекта шела. Пример есть тут http://msdn.microsoft.com/en-us/library/bb...28VS.85%29.aspx


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Нитонисе
Дата 30.10.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(Alexeis @  30.10.2010,  12:17 Найти цитируемый пост)
Для Vista+ это делается при помощи COM объекта шела.

А для XP и выше?
PM MAIL   Вверх
Alexeis
Дата 30.10.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(Нитонисе @  30.10.2010,  13:24 Найти цитируемый пост)
А для XP и выше? 

  для выше это что? Для ХР и ниже через реестр. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Нитонисе
Дата 30.10.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(Alexeis @  30.10.2010,  14:06 Найти цитируемый пост)
для выше это что? Для ХР и ниже через реестр. 

Угиверсальный подход, чтобы годился для XP и более новых операционных систем.
PM MAIL   Вверх
oldcode
Дата 30.10.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 8.10.2010

Репутация: 0
Всего: 0



Цитата(Нитонисе @ 30.10.2010,  11:47)
зарегистрировать свой тип файлов.
чтоб информация там искажалась

1. Напишите следующую функцию:
Код

#include <Registry.hpp>
TRegistry *Reg;
Reg=NULL;
try
{
  Reg=new TRegistry;
  Reg->RootKey=HKEY_CLASSES_ROOT;
  Reg->OpenKey("\\.ant",true);
  Reg->WriteString("","MyProgram");
  Reg->CloseKey();
  Reg->OpenKey("\\MyProgram", true);
  Reg->WriteString("","My document");
  Reg->CloseKey();
  Reg->OpenKey("\\MyProgram\\Shell\\Open\\Command",true);
  Reg->WriteString("",ParamStr(0)+" \"%1\"");
  Reg->CloseKey();
  Reg->OpenKey("\\MyProgram\\DefaultIcon",true);
  Reg->WriteString("",ParamStr(0)+", 1");
  Reg->CloseKey();
}
__finally
{
if (Reg!=NULL)delete Reg;
}
// Весь текст генерирует расширение *.ant

// А этот код загружает файл с расширением *.ant в Image1.
if (ParamCount>0)
{
asFileName=ParamStr(1);
if (FileExists(asFileName)) Image1->Picture->LoadFromFile(asFileName);
  else ShowMessage(asFileName+" ОШИБКА ЗАГРУЗКИ ФАЙЛА!!!");
}

2. Шифруйте содержимое
самый простой и достаточный для вашей цели алгоритм - XOR

2Alexeis - а в Вынь7 регистр уже отменили ? Или метод SetAppAsDefault просто  не будет работать в ОС версии ниже Виста ?

Это сообщение отредактировал(а) oldcode - 30.10.2010, 14:35
PM MAIL   Вверх
Alexeis
Дата 30.10.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(oldcode @  30.10.2010,  15:16 Найти цитируемый пост)
Или метод SetAppAsDefault просто  не будет работать в ОС версии ниже Виста ?

Там же написано в документе Minimum supported client - Windows Vista

А на счет реестра, судя по отзывам это работать не будет. Возможно дело в в правах доступа, возможно просто изменили съему. Но знаю одно, что в Виста+ можно несколько приложений повесить на одно расширение, но лишь одно приложение будет открывать по умолчанию. Так что схема изменилась. В общем нужно проверять.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
oldcode
Дата 31.10.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 8.10.2010

Репутация: 0
Всего: 0



Цитата(Alexeis @ 30.10.2010,  15:37)
Возможно дело в в правах доступа

а про UAC мысль не посещала ?
PM MAIL   Вверх
migddk
Дата 1.11.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2010

Репутация: нет
Всего: нет



Цитата(Нитонисе @ 30.10.2010,  11:47)
Надо зарегистрировать свой тип файлов. Суть его - заполнение некоторых исходных данных для моей программы. Наборы исходных данных могут быть разные - потому хотелось бы иметь возможность сохрнаять их в файл, и загружать снова. При этом хотелось бы зарегистрировать для своего расширения особый значок для файлов. 

Зарегистрированные расширения хранятся в реестре как ключи корневого ключа HKEY_CLASSES_ROOT. Например, если вы хотите зарегистрировать расширение .my, то должны создать в ключе HKEY_CLASSES_ROOT ключ с именем ".my". Единственным параметром этого ключа должно быть имя ключа, содержащего развернутую информацию. Например, "myfile". Указанный ключ также хранится в разделе корневого ключа HKEY_CLASSES_ROOT. В этом ключе создается цепочка ключей shell\open\command. В последнем ключе command задается параметр, значение которого - полное имя файл приложения, обрабатывающего файлы с вашим расширением. Если при запуске этого приложения в него надо через командную строку передать имя файла, то после имени приложения указываются символы "%1". Так что если, например, вы хотите обрабатывать файлы приложением MyProgram, расположенным в каталоге C:\MyProjrcts, то в реестре соответствующий параметр должен иметь вид "C:\MyProjrcts\MyProgram.exe %1".

При регистрации расширения можно одновременно зарегистрировать и пиктограмму, которая будет отображаться в папках около файлов с этим расширением. Для этого в ключе, содержащем информацию о приложении (в рассматриваемом примере - в ключе myfile) надо создать подключ DefaultIcon и в нем задать параметр со значением, указывающим пиктограмму: имя файла и, после запятой, - индекс пиктограммы. Например, если вы хотите указать главную пиктограмму вашего приложения, обрабатывающего файлы, то значение этого параметра может быть следующим: " C:\MyProjrcts\MyProgram.exe, 0".

В результате регистрации автоматически создастся также параметр с именем вашего приложения в ключе HKEY_CURRENT_USER \ SoftwareMicrosoft \ Windows \ ShellNoRoam \ MUICache. Это обеспечит в дальнейшем пользователю возможность назначать средствами Windows ваше приложение для обработки файлов с иным расширением.
Ниже приведен пример приложения, регистрирующего расширение файлов .my и обрабатывающего эти файлы. Приложение имеет кнопку Регистрация расширения .my (ее имя  BReg) и кнопку Отмена регистрации расширения (имя BUnReg). В качестве обрабатывающего приложения регистрируется это же приложение, загружающее открываемый файл в окно Memo1. В реальном случае, конечно, регистрировать и обрабатывать файлы должны разные приложения: регистрация должна проводиться программой, устанавливающей ваше приложение на компьютере.

Ниже приводится код .


Код


#include "registry.hpp"

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TRegistry *reg = new TRegistry;
 reg->RootKey = HKEY_CLASSES_ROOT;
 // создается ключ ".my"
 reg->OpenKey(".my",true);
 // создается параметр со значением "myfile"
 reg->WriteString("", "myfile");
 reg->CloseKey();
 // создается ключ "myfile\DefaultIcon"
 reg->OpenKey("myfile\\DefaultIcon",true);
 // заносится значение пиктограммы: "имя приложения, 0"
 reg->WriteString("", ParamStr(0) + ", 0");

 reg->CloseKey();
 // создается ключ "myfile\shell\open\command"
 reg->OpenKey("myfile\\shell\\open\\command", true);
 // создается параметр со значением "имя файла %1"
 reg->WriteString("", ParamStr(0) + " %1");
 reg->CloseKey();
 reg->Free();
}
//-------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 TRegistry *reg = new TRegistry;
 reg->RootKey = HKEY_CLASSES_ROOT;
 // удаление ключей ".my" и "myfile"

 reg->DeleteKey(".my");
 reg->DeleteKey("myfile");
 reg->Free();
}
//-------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if (ParamCount() > 0)
 {
  Memo1->Lines->LoadFromFile(ParamStr(1));
  Label1->Caption = "файл '" + ParamStr(1) + "'";
 }
}



Особых комментариев этот код, вероятно, не требует. В реальном приложении вам надо заменить в этом коде "my" на то расширение, которое вам необходимо. Кроме того, в приведенном коде в качестве обработчика задается текущее приложение. Его имя с путем получается вызовом функции ParamStr(0). В реальном приложении это имя файла также надо заменить.
Отмена регистрации, осуществляемая в процедуре BUnRegClick, сводится к стиранию ранее созданных ключей.

Обработчик события формы OnCreate определяет функцией ParamCount, передан ли параметр через командную строку. Если передан, то файл, имя которого передано, загружается в окно Memo1. Подобный обработчик (конечно, не сводящийся к загрузке в Memo) должен быть вставлен в приложение, обрабатывающее файлы.

Это сообщение отредактировал(а) migddk - 1.11.2010, 11:48
PM MAIL   Вверх
oldcode
Дата 2.11.2010, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 8.10.2010

Репутация: 0
Всего: 0



Цитата(migddk @ 1.11.2010,  11:45)
Особых комментариев этот код, вероятно, не требует.

Вы, наверное, не обратили внимания, что темой прений было, в каких версиях ОС это будет работать.
PM MAIL   Вверх
Нитонисе
Дата 2.11.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



migddk, спасибо за развернутый ответ! Но что касается версий ОС - вопрос тоже актуальный.
PM MAIL   Вверх
Alexeis
Дата 2.11.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Судя по документации старая схема работает вполне http://msdn.microsoft.com/en-us/library/cc...v=VS.85%29.aspx


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 2.11.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Еще интересная информация
Цитата

Registry functions such as RegOpenKeyEx or RegQueryValueEx allow you to specify the HKEY_CLASSES_ROOT key. When you call these functions from a process running in the interactive user account, the system merges the default settings in HKEY_LOCAL_MACHINE\Software\Classes with the interactive user's settings at HKEY_CURRENT_USER\Software\Classes

  А также 
Цитата

To change the settings for the interactive user, store the changes under HKEY_CURRENT_USER\Software\Classes rather than HKEY_CLASSES_ROOT.

  Т.е. грубо говоря секции HKEY_CLASSES_ROOT не существует. Более того Microsoft рекомендует использовать секцию HKEY_CLASSES_ROOT только для чтения. Однозначно что если писать в секцию HKEY_CURRENT_USER\Software\Classes, то проблем с правами не будет, потому что это секция текущего пользователя. Но в этом случае ассоциации будут работать только для этого пользователя. Иначе нужны права админа на использование HKEY_LOCAL_MACHINE\Software\Classes

  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
oldcode
Дата 3.11.2010, 05:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 8.10.2010

Репутация: 0
Всего: 0



Цитата(Alexeis @ 2.11.2010,  10:56)
Судя по документации старая схема работает вполне http://msdn.microsoft.com/en-us/library/cc...v=VS.85%29.aspx

что и требовалось доказать...
PM MAIL   Вверх
Alexeis
Дата 3.11.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(oldcode @  3.11.2010,  06:54 Найти цитируемый пост)
что и требовалось доказать... 

  При наличии администраторских прав. А права у пользователей администраторов в Vista+ несколько другие уже.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0638 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.