Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Открыть ParamStr(1) и не загрузить программу заново. [D7, XP]


Adil ©   (2006-07-01 00:08:00) 

Как это делается?? Мне надо делать так чтобы когда Открывал файл(файл открывается через мою прогу) он не загружал прогу если оно уже есть, а открывал его в сушествующем окне проги.

Многие способы придумал от WinAPI до COM. На некоторых(а может у всех) это через DDE делали.

Вообшим как это законно делат??


Desdechado   (2006-07-01 13:32:00) [1]

а что значит "Открыть ParamStr(1)" ?


Юрий Зотов   (2006-07-01 12:33:00) [2]

> koha   (01.07.06 06:14) [1]

Это не самый лучший способ. Многие программы довольно долго инициализируются ДО создания своего первого окна. Если в это время запустить вторую копию, то FindWindow, естественно, ничего не найдет и она спокойно запустится. А также запустятся третья копия, четвертая и т.д. - сколько угодно, пока одна из копий не создаст окно.

Давайте отвлечемся от окон и посмотрим на саму идею. Она состоит в том, что первая копия создает в системе некий уникальный объект, а другие копии проверяют существование этого объекта.

В приведенном Вами примере таким объектом выбрано окно. Но кто сказал, что им может быть только окно? Никто. Им может служить любой объект, к которому система разрешает глобальный доступ. Например, memory mapped file, мьютекс, семафор и пр.

Преимущество такого решения состоит в том, что если программа требует длительной инициализации, то создавать окно ПЕРЕД ней - плохо (получится как бы "зависшее" окно и чтобы избежать эффекта "зависания", придется мудрить с потоками, что усложняет программу). А вот создать перед этой инициализацией не окно, а НЕВИДИМЫЙ объект - это никто мешает и это никому не мешает. И программа практически не усложняется.

> Adil ©   (01.07.06 00:08)

Здесь пример готового решения:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=904


koha   (2006-07-01 06:14:00) [3]

В вайле проекте .dpr может быть стоит использовать функцию FindWindow('Class окна','Caption окна') для поиска уже запущенной копии своей проги. Вот например сдесь прога будет запускаться находить свою копию уже запущенной и вырубаться, а ты в своем случае можешь послать сообщение своей проге.

program New;
uses
 Forms,SysUtils,Windows,Classes,
 Unit1 in 'Unit1.pas' {Fm};
Var
 hw: HWND;
{$R *.res}

begin  

 if FindWindow('TFm','Fm') <> 0 then Application.Terminate;

 Application.Initialize;
 Application.CreateForm(TFm, Fm);
 Application.Run;
end.


Наверх

Титульная страница Поиск, карта сайта Написать письмо