Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск файла, как в проводнике 
V
    Опции темы
Keeper89
Дата 21.4.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Доброго времени суток!

Задача тривиальная - открыть файл из Delphi. Файлы, связанные с какой-либо программой, замечательно открываются функцией ShellExecute.  Интересно следующее: как через функцию ShellExecute (или др.) открыть незарегистрированный файл так, как его открывает проводник Windows (появляется стандартный диалог с запросом поиска программы в интернете или выбора вручную). Обычное использование ShellExecute просто возвращает результат < 32.

Заранее спасибо.

Это сообщение отредактировал(а) Keeper89 - 21.4.2009, 23:49


--------------------
PM MAIL WWW   Вверх
Valechik2
Дата 24.4.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А самому сделать такое окно никак?
PM MAIL   Вверх
kami
Дата 25.4.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Valechik2 @  24.4.2009,  21:45 Найти цитируемый пост)
А самому сделать такое окно никак?

Да?
А как вы предлагаете осуществлять поиск соответствия в интернете или на локальном компьютере?
Ладно с интернетом, возьмем локальную машину. Предлагаете перебирать все установленные программы, анализируя их параметры запуска, т.е. может ли установленная программа воспринимать запуск с файлом из командной строки+через DDE, вносить их в визуальный список и запускать самому?
Расточительно чересчур.

Кстати, поиск по MSDN не дал мне ответа на этот вопрос. Но это возможно, ведь так умеет делать не только проводник, но и (к примеру) TotalCommander. Скорее всего, не там (и не так) искал...

Добавлено через 9 минут и 54 секунды
Хотя, стоп.
Вот этот код вызывает появление стандартного диалога в Windows Vista:

Код

if OpenDialog1.Execute then
    ShellExecute(Handle, nil, @OpenDialog1.FileName[1], nil, nil, SW_SHOW);

PM MAIL WWW   Вверх
Keeper89
Дата 25.4.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Спасибо за обсуждение.
Решил вопрос следующим образом:
Код

  function OpenFile(const filename: String): Integer;
  var
    SEI: TShellExecuteInfo;
  begin
    FillChar(SEI, SizeOf(SEI), 0);
    with SEI do
    begin
      cbSize := SizeOf(SEI);
      lpFile:= PChar(filename);
      nShow:= SW_SHOWNORMAL;
    end;
    Result := Integer(ShellExecuteEx(@SEI));
  end;

P.S. 
kami, есть ли разница между PChar(filename) и @filename[1]? И если да, то что использовать лучше?

Это сообщение отредактировал(а) Keeper89 - 25.4.2009, 14:14


--------------------
PM MAIL WWW   Вверх
kami
Дата 25.4.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Keeper89 @  25.4.2009,  14:13 Найти цитируемый пост)
 есть ли разница между PChar(filename) и @filename[1]? И если да, то что использовать лучше?

Есть.
@filename[1] нельзя использовать, если заранее неизвестно, возможна ли ситуация filename=''. Иначе вылезет исключение, т.к. индекса [1] не существует. Это, кстати, можно использовать и в целях отладки.
В остальном - дело предпочтений (мне, например, удобнее с @), хотя можно глянуть и в CPU window, возможно есть и более существенные отличия.

Многие компоненты сторонних разработчиков используют свое приведение к PChar, т.к. PChar('') возвращает валидный указатель на пустую строку, а в некоторых случаях нужно, чтобы возвращался nil.

Это был вольный перевод ответа Набережных С. на мой абсолютно такой же вопрос года 3 назад.
PM MAIL WWW   Вверх
Keeper89
Дата 25.4.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ОК, возьму на заметку.

Это сообщение отредактировал(а) Keeper89 - 25.4.2009, 16:30


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

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

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


 




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


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

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