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

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

Передать параметр первой копии программы [D5]


tsarevep ©   (2002-07-10 02:41:00) 

Здравствуйте всем!
Ребят поможите, а то зациклился совсем.
Вообщем програма SDI интерфейс, с возможностью открытия нескольких документов. Повторный экземпляр программы недопстим и не должен быть нужен. Когда с програмной строки запускаю на открытие документ, то все прекрасно открывается, но если программа уже запущена, естественно ParamStr идёт для второй копии. И просто закрывается второй экземпляр.
Подскажите плиз как передать этот параметр первой копии программы.
С уважением.


tsarevep   (2002-07-11 08:20:00) [1]

Приогромнейшее спасибо всем!
То Юрий Зотов © - Да не практически, а готовое, даже названия переменных с моими совпали и поэтому только {Copy - Paste).
Прогнал я ее по всем статьям. Единственная ошибка почему то если сделать Edit With MYPROGRAMM больше 34 файлов Windows говорит "Отказано в доступе указанному пути или файлу". Хотя редко у кого ума хватает сразу 35 файлов отправить в какую нибудь прогу, но все равно неприятно. Если вам не трудно напишите почему это происходит.
Особая вам благодарность.
С уважением.


Юрий Зотов   (2002-07-11 02:32:00) [2]

Практически готовое решение (и даже не одно) см. здесь:
http://www.delphikingdom.com/helloworld/samples_win.htm


I am   (2002-07-11 02:26:00) [3]

Я это делал через FileMapping. При запуске приложения оно проверяет наличие файла отображаемого в память. Если его нет значит оно его создает и пишет туда свой хэндл, а если есть, то считывает из него хэндл уже запущенного приложения и посылает ему свои параметры через WM_COPYDATA.

CreateFileMapping
MapViewOfFile


tsarevep   (2002-07-10 12:56:00) [4]

Огромное спасибо!
Но поиск окна по Application.Title не подходит, так как он постоянно изменяется. Да и просто лежит компонента на форме которая не даёт второй запуск. Но у нее есть событие OnAlreadyExist в котором и можно передать ParamStr только не доходит как. Вот нужно как то засунуть в эту процедуру что то вроде.

if параметр then
не знаю чего
else
halt;// тоже не обязательно сама убьёт

Ну а DDE может и не плохо было бы только у меня 8 книжек и только в двух написано про то как связать свою прогу через DDE c Exсel, а зачем мне Excel. В остальных вобще этот протокол упущен.
C уважением.


handra   (2002-07-10 11:09:00) [5]

Вот только параметры в виде строки с помощью SendMessage не передать, придется задуматься над использованием DDE.


Fiend   (2002-07-10 10:57:00) [6]

const WM_MESSAGETOSERVER = WM_USER+1;

type
TMainForm = class(TForm)
private
{ Private declarations }
procedure MESSAGETOSERVER(var Message: TMessage); message WM_MESSAGETOSERVER;
public
{ Public declarations }
end;

procedure TMainForm.MESSAGETOSERVER(var Message: TMessage);
begin
//Это обработчик пользовательского события
case Message.WParam of
1 : pmShutDownServerClick(nil);
2 : pmStopServerClick(nil);
3 : StartServer;
end;
end;

А это функция которая ищет окно прдидущего инстанса, если находит возвращает его хэндл, если нет то 0

function FindHwnd: hWnd;
VAR Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
Result:=0;
Wnd := MainForm.Handle;
WHILE Wnd <> 0 DO
BEGIN
{


tsarevep   (2002-07-10 10:49:00) [7]

Конечно б надо!
Спасибо заранее.


Fiend   (2002-07-10 10:13:00) [8]

я делал так:
при загрузке экземпляра искал окно предидущего инстанса. Затем посылал ему по хэндлу сообщение с параметрами. Если нада могу вырезать текст


tsarevep   (2002-07-10 10:10:00) [9]

Ну разве никто этим не занимался?
С уважением.


Наверх

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