Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать ассоциации файлов с моей программой? 
:(
    Опции темы
gif0
  Дата 11.2.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Допустим, я написал программу для просмотра изображений. Как сделать так, что бы после двойного клика по изображению (jpg, png, gif и т.п.) в проводнике его открывала именно моя программа? Т.е. как связать программу с определенными расширениями файлов? Насколько я понял, это делается через реестр, но у меня не вышло.  Пожалуйста, покажите пример кода.

Добавлено через 3 минуты и 43 секунды
Я пробовал вот этот код, но не работает:

Код

TRegistry * Reg = new TRegistry;
Reg->RootKey = HKEY_CLASSES_ROOT;
Reg->OpenKey(".jpg\\shell\\open\\command", true);
Reg->WriteString("",Application->ExeName + "%1");
Reg->CloseKey();
delete Reg;


Так же пробовал с помощь консольных команд assoc и ftype.
system("assoc .txt=txtfile");
system("ftype txtfile=\"D:\\Софт\\Notepad++\\notepad++.exe \"%1\"");
Но через них вышло сделать ассоциацию только с .txt, с .jpg не вышло.

Это сообщение отредактировал(а) gif0 - 11.2.2010, 18:29
PM MAIL   Вверх
jonie
Дата 11.2.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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





--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
gif0
Дата 11.2.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



jonie, спасибо, но я юзаю C++ Builder, а этот класс написан под VC++ (естественно, у меня не компилится). Пытался разобраться, но что-то не вышло. 

Так что проблема остается.
PM MAIL   Вверх
artsb
Дата 11.2.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



gif0, поищите в разделе C++ Builder. Я как-то писал про это 100%


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 11.2.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



gif0, держи: ссылка.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
gif0
Дата 12.2.2010, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



artsb, спасибо! Завтра протестирую.
PM MAIL   Вверх
Dem_max
Дата 12.2.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Не поленился потратил на тебя 5 минут и переписал  класс отсюда http://www.codeproject.com/KB/shell/cgfiletype.aspx



Это сообщение отредактировал(а) Dem_max - 12.2.2010, 09:54

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  cgfiltyp.zip 2,45 Kb


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
gif0
  Дата 12.2.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Dem_max, подключил, скомпилировалось без ошибок. После этого пишу в конструкторе:
Код

    CGCFileTypeAccess TheFTA;

    // get full file path to program executable file
    TCHAR    szProgPath[MAX_PATH * 2];
    ::GetModuleFileName(NULL, szProgPath, sizeof(szProgPath)/sizeof(TCHAR));

    AnsiString csTempText;

    TheFTA.SetExtension("jpg");

    // just pass file path in quotes on command line
    csTempText  = szProgPath;
    csTempText += " \"%1\"";
    TheFTA.SetShellOpenCommand(csTempText.c_str());
    TheFTA.SetDocumentShellOpenCommand(csTempText.c_str());

    TheFTA.SetDocumentClassName("CGFileType.Document");

    // use first icon in program
    csTempText  = szProgPath;
    csTempText += ",0";
    TheFTA.SetDocumentDefaultIcon(csTempText.c_str());

    // set the necessary registry entries
    TheFTA.RegSetAllInfo();


У меня не работает. Может ты у себя на машине протестируешь, а потом напишешь, что вышло. Я подозреваю, что у меня этот код не работает из-за того, что у меня win 7.

Это сообщение отредактировал(а) gif0 - 12.2.2010, 16:23
PM MAIL   Вверх
gif0
  Дата 12.2.2010, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

В ветке HKEY_CLASSES_ROOT\Applications создаёте раздел. Не важно как назовёте, но обычно называют так: имя_ехе.exe
В нём подраздел shell. В нём open. В нём command.
Получается такой путь:
HKEY_CLASSES_ROOT\Applications\shell\open\command
Параметр по умолчанию для command задаёте так:
"Полный путь к вашему ехе" "%1"

Теперь, непосредственно в ветке HKEY_CLASSES_ROOT создаёте раздел с именем как у вашего расширения, например:
HKEY_CLASSES_ROOT\.txt
В нём подраздел OpenWithList. А уже в нём пустой раздел с именем которое вы использовали в HKEY_CLASSES_ROOT\Applications, т.е. обычно это имя_ехе.exe


artsb, сделал все по твоей инструкции, вот код:

Код

TRegistry * Reg = new TRegistry(KEY_ALL_ACCESS);
Reg->RootKey = HKEY_CLASSES_ROOT;
Reg->OpenKey("\\Applications\\" + GetFileNameWithPath(Application->ExeName) + "\\shell\\open\\command", true);
Reg->WriteString("",Application->ExeName + " \"%1\"");
Reg->CloseKey();

Reg->OpenKey("\\.jpg\\OpenWithList\\" + GetFileNameWithPath(Application->ExeName), true); // ф-ция GetFileNameWithPath принимает путь к файлу и возвращает его имя, типа "proga.exe"
delete Reg;


Не работает!  Смотрел в реестре, там все создалось по твоей инструкции! Пожалуйста, протестируйте у себя.

Это сообщение отредактировал(а) gif0 - 12.2.2010, 23:03
PM MAIL   Вверх
artsb
Дата 12.2.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



gif0, почитайте вот эту статейку. Может поможет. Просто у меня сейчас нет времени проверять.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
MiCr0s0fT
Дата 23.4.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всё это отлично, если пользователь имеет повышенные привилегии ... 

Пишу программу, которая работает с изображениями ...
Вношу в реестр изменения. Работает без проблем и нареканий.

Решил опробовать, сможет ли обычный пользователь изменить ассоциации с помощью созданной программы.
Ответ - не сможет.

В самом начале я писал изменения в ветвь: HKEY_CLASSES_ROOT\*имя программы*\shell\\open\command\
Запустив под юзером, понял, что таких глобальных изменений пользователь сделать не сможет.
Открыл мониторинг реестра и начал смотреть, что творится в реестре, когда пользователь меняет приложение по-умолчанию.

Действительно, система создаёт путь: HKEY_CLASSES_ROOT\Applications\*имя программы*\shell\open\command

Всё отлично, подумал я. Но ошибся. В итоге всё равно выплывает запрет на создание веток в HKCR.
Подскажите пожалуйста, как можно программно выполнить регистрацию приложения имея учётную запись типа "пользователь".
Система это делает на ура. Раз руками можно сделать, то можно и программно... только как?
PM MAIL   Вверх
borisbn
Дата 24.4.2010, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



В функции RegCreateKeyEx есть параметр SECURITY_ATTRIBUTE. Возможно система подставляет туда администратора, когда ты руками делаешь ассоциацию. Попробуй так же 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 26.4.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MiCr0s0fT @  23.4.2010,  21:03 Найти цитируемый пост)
Система это делает на ура. 

Ключевое слово здесь система. Она сама исполняется не от имени пользователя
Цитата

Раз руками можно сделать, то можно и программно
Можно, если эта программа - часть системы.
Поищите тут -

Цитата

Extensions Entries for Users
----------------------------

The Extensions subkey identifies personal preferences for document files
with corresponding command lines, so that opening a document file in File
Manager automatically starts the application. The extensions are found in
the following Registry path:

   HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Extensions

Хотя это довольно древняя ветка, может уже и не работать  smile 



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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