Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  01:27[Войти] | [Зарегистрироваться]
Ответ на вопрос № 41422

06-04-2006 09:41
Здраствуйте!!!

Есть такая проблема: при двойном клике по файлу в "проводнике" он должен открыться в моей проге, я делал передачу пути к файлу через DDE. Все работает отлично, если прога запущена, в противном же случае - запускается моя прога, далее по хорошему должен по DDE передайться путь к файлу, так нет - выскакивает ошибка "Windows не удается найти файл..." и соответственно ничего не передается! Может быть кто-нибудь знает решение этой проблемы?

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

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

18-06-2006 13:36 | Комментарий к предыдущим ответам
Ну так и описали бы его в статье Обобщающий пример по работе с WinAPI

Он мне не нравится тем, что не даёт гарантию от повторного запуска программы, если запускать её прямо, а не через ассоциированные файлы. Поэтому, даже с использованием DDE, программе для предотвращения повторного запуска и передачи командной строки из второго экземпляра в первый пришлось бы делать всё то же самое, что и без DDE. А раз так - какой смысл приделывать к программе код, который в итоге не даёт никаких преимуществ?

18-06-2006 00:53 | Комментарий к предыдущим ответам
>>> Существует документированный способ ...  я это знаю
Ну так и описали бы его в статье Обобщающий пример по работе с WinAPI

10-06-2006 15:13 | Сообщение от автора вопроса
Спасибо, я уже разобрался с этой проблемой.

10-06-2006 14:30
>>> прописать в реестре
А разве FindWindow+SendMessage сложнее? Для ассоциации нужно создать в разделе HKEY_CLASSES_ROOT нужное расширение (прописать значение по умолчанию - описание файла), внутри прописать раздел DefaultIcon (значение по умолчанию - иконка, которую будет отображать Explorer, скорее всего - имя приложения, запятая, номер иконки в ресурсах) и Shell (значение по умолчанию - то, что будет отображаться в контекстном меню жирным и выполняться по умолчанию); в нем надо создать раздел, например Open (можно больше), внутри которого - раздел Command, в значение по умолчанию которого записать путь к своей программе в кавычках (если содержит пробел) и параметр %1 в кавычках (на случай, если он будет иметь пробел в имени)). Теперь при запуске программы стоит проверить через FindWindow или мьютексы, или MMF (Memory Mapped Files), что данное приложение еще не запущено, после чего проанализировать командную строку и если это необходимо, отправить сообщение WM_COPYDATA найденному окну (или по хендлу, который сохранен в MMF), или любое сообщение, передавая данные через мьютексы, атомы (»вопрос КС №41261«) или handle глобально выделенной области памяти. Подробнее можно почитать в »вопрос КС №34059«, »вопрос КС №34402«, готовую реализацию посмотреть в Использование WinAPI часть 3 или написать самому. В принципе я так привык и мне удобно.
Теперь давайте рассмотрим как делается через DDE. Помимо того, что мне придется создать раздел реестра как я описывал ранее, придется еще создать в разделе Command раздел ddeexec (в параметр по умолчанию пропиши макрос, который должен выполняться при попытке открытия файла, например open "%1", кавычки могут отсутствовать), в котором разместить разделы: application (в разделе по умолчанию - имя исполняемого файла, можно с путем, но без расширения .exe), и topic (там нужно указать имя компоненты TDDEServerConv в программе). Так? Продолжим. В программе потребуется закинуть компонент TDDEServerConv (название должно совпадать с тем, что прописано ранее в ассоциации, помните!) в OnExecuteMacro которого прописать нечто вроде:

procedure TDDEServer.pthConvExecuteMacro(Sender: TObject; Msg: TStrings);
begin
if Copy(Msg.Text,1,4)='open' then begin
  открыть_файл(Copy(Msg.Text,7,Length(Msg.Text)-8);
end;
end;


Вот теперь вроде все. Кстати, если вспомнить, что DDE основан также на отправке сообщений, становится сомнительным хоть какой то выигрыш в эффективности или простоте использования этого подхода. Впрочем, программист должен знать оба метода. Как снайпер должен знать приемы рукопашного боя - на всякий случай.

04-06-2006 12:35 | Комментарий к предыдущим ответам
И все-таки лучше всего - технология ParamStr/WM_COPYDATA, потому что она прозрачнее DDE. KISS - Keep It Simple, Sydney.

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

Хочу спросить у всех, кто советует использовать WM_CopyData или что-нибудь ещё: знаете ли вы, что именно нужно прописать в реестре, чтобы система знала о том, что ваше приложение умеет использовать WM_CopyData, и сама попыталась бы послать ей это сообщение, чтобы без необходимости не запускать новую копию программы? Подчёркиваю - именно прописать в реестре, без дополнительного кода по поиску/связи второго экземпляра приложения с первым? В случае с DDE я это знаю.

04-06-2006 07:28
И все-таки лучше всего - технология ParamStr/WM_COPYDATA, потому что она прозрачнее DDE. KISS - Keep It Simple, Sydney.

09-04-2006 09:56
To Антон Григорьев:

Вам виднее... А я не использовал и нет надобности в DDE... Можно и через COM всё, что надо, получить и сделать...

08-04-2006 13:44 | Комментарий к предыдущим ответам
Куфенко Павел:

Microsoft эту возможность пока оставила, но они настоятельно не рекоммендуют её использовать в разработке нового ПО!

У меня установлен MS Office 2003. Только что проверил - он использует этот механизм. Потому что, как я уже сказал, альтернативы нет.

07-04-2006 13:56 | Комментарий к предыдущим ответам
To Антон Григорьев:

Действительно... Microsoft эту возможность пока оставила, но они настоятельно не рекоммендуют её использовать в разработке нового ПО!

07-04-2006 01:54
Ума не разложу, нафига DDE?
Всё делаецца через ParamStr() и WM_COPYDATA (в случае передачи имени файла(ов) уже запущенной копии приложения).

07-04-2006 01:52 | Комментарий к предыдущим ответам
Куфенко Павел:

Microsoft отказался от дальнейшего развития DDE, но в целях совместимости ряд системных механизмов продолжают его использовать, в т.ч. и тот механизм, о котором идёт речь в вопросе. И готовой альтернативы нет.

06-04-2006 14:43
To Artem:

Забудь про DDE, если пишешь "серьёзные" программы. Даже Microsoft отказалась от него... ;)

06-04-2006 12:30 | Сообщение от автора вопроса
Мне необходимо по DDE.

06-04-2006 11:46
Вообще, при открытии файла в каком-либо приложении, имя этого файла и так передается в командной строке. Вы можете получить доступ к ней из программы, воспользовавшись переменными ParamCount и ParamStr

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Кто съел Красную шапочку?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования