Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2011, 15:54   #1
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию Межпрограммное взаимодействие

Доброго времени суток.
Задача:
1. При запуске программы сделать проверку на наличие уже запущенной.
2. Если запущенная программа имеется, то отправить ей некую функцию.
3. Обработать функцию запущенной программой.

Этот вопрос решен и поиск по нему дает не мало результатов и здесь и на других ресурсах, но решен только первый (кое-где частично и второй) пункт поставленной задачи. Не выходит именно обработать посланное сообщение первому открытому окну.

Первый шаг:
Код:
var
  HM: THandle;

// Проверка через Mutex
function Check: boolean;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'CdpApp');
  Result := (HM <> 0);
  if HM = 0 then
   HM := CreateMutex(nil, false, 'CdpApp');
end;

begin
  if Check=True then
  begin 
  // Если повторно открываем файл, а не саму программу
  if paramcount>0 then
  SendMessage(FindWindow('Tcdpmain',nil),MY_MESSAGE,0,DWord(ParamStr(1)));
  Exit;
  end;

  Application.Initialize;
  Application.Run;
end.
В самой программе обработчик сообщения выглядит так:
Код:
cont MY_MESSAGE = WM_USER + 4242;
...
procedure ReceiveMessage (var Msg: TMessage); message MY_MESSAGE;
...
procedure Tcdpmain.ReceiveMessage;
 var
   txt: PChar;
 begin
   txt := PChar(msg.lParam);
   msg.Result := 1;
   FullOpen(txt);
end;
Все это сейчас работает таким образом: один экземпляр программы открыт. Запускаем второй (открываем файл через нашу программу), получаем: с первым экземпляром ничего не происходит, в итоге создается еще один, который и принимает сообщение о пути открытого файла, и открывает его.

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

Последний раз редактировалось kettanaito; 15.08.2011 в 16:04.
kettanaito вне форума Ответить с цитированием
Старый 15.08.2011, 16:32   #2
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

я так и не понял что у тебя не получается, у меня твой код работает
Код:
procedure ReceiveMessage (var Msg: TMessage); message MY_MESSAGE;
Код:
procedure TForm1.FormActivate(Sender: TObject);
var hw:HWND;
begin
label1.Caption:=ParamStr(1);

  if Check=True then
  begin
  hw:=FindWindow('TForm1','rere');
  if hw<>0 then
    SendMessage(hw,MY_MESSAGE,0,DWord(ParamStr(1)))
    else
    ShowMessage('не нашли хендл');  //сделал для наглядности 
  close;
  end;

end;
Код:
procedure TForm1.ReceiveMessage(var Msg: TMessage);
begin
 ShowMessage(string(msg.lParam));
end;
fate вне форума Ответить с цитированием
Старый 15.08.2011, 16:46   #3
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

fate, по вашему коду все работает, но получение сообщения происходит раньше, чем его отправка:

Код:
procedure Tcdpmain.ReceiveMessage;
begin
//FullOpen(string(msg.lParam));
ShowMessage('Recieved');
end;
...
procedure Tcdpmain.FormActivate(Sender: TObject);
var hw:HWND;
begin

  if Check=True then
  begin
  hw:=FindWindow('Tcdpmain',nil);
  if hw<>0 then
  begin
    if paramcount>0 then
    begin
    SendMessage(hw,MY_MESSAGE,0,DWord(ParamStr(1)));
    ShowMessage('Send');
    end;
  end
    else
    ShowMessage('Handle error');
  close;
  end;
end;
При выполнении сначала выбивает "Recieved", а уже затем "Send". Как так?
kettanaito вне форума Ответить с цитированием
Старый 15.08.2011, 16:49   #4
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

почему раньше?
вот ты отправляешь
Код:
SendMessage(hw,MY_MESSAGE,0,DWord(ParamStr(1)));
потом отработал этот код
Код:
ShowMessage('Recieved');
а потом этот
Код:
ShowMessage('Send');
fate вне форума Ответить с цитированием
Старый 15.08.2011, 16:49   #5
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

сделай так
Код:
ShowMessage('Send');
SendMessage(hw,MY_MESSAGE,0,DWord(ParamStr(1)));
fate вне форума Ответить с цитированием
Старый 15.08.2011, 16:53   #6
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

fate, действительно, извиняюсь, все верно. Просто процедура при получении сообщения не работает, вот и подумал, что из-за этого...

Код:
procedure Tcdpmain.ReceiveMessage;
var msg2:string;
begin
msg2:=string(msg.lParam);
//ShowMessage('Rec '+msg2);
FullOpen(msg2);
end;
FullOpen - схоже с document.lines.loadfromfile(...). При получении на секунду в документ подгружается файл, но после документ очищается. Не могу выяснить почему, ошибки в самой процедуре FullOpen нет.
kettanaito вне форума Ответить с цитированием
Старый 15.08.2011, 17:00   #7
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

покажи свою процедуру FullOpen
fate вне форума Ответить с цитированием
Старый 15.08.2011, 17:04   #8
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Код:
procedure Tcdpmain.FullOpen(FilePath:String);
var sel:string; m,n: TTreeNode;
begin
  Open(FilePath,False); // = lines.loadfromfile

  document.Lines.LoadFromFile(FilePath);
  rzBox.ApplyFilePath(FilePath); // rzBox = TrzFileListBox
  OpenFolder(rzBox.Directory); 

  rzFolders.Select(rzFolders.items[0]);
  sel:=StringReplace(rzBox.FileName,rzBox.Directory,rzFolders.Items[0].Item[plist.items.count-1].Text,[]);
  sel:=lanini.ReadString('Folders list','Projects','Projects')+'\'+sel;
  rzFolders.SelectByPath(sel);
  OpenNode:=rzFolders.Selected;

  current:=FilePath; //current: string
  refreshCaption; // обновление заголовка
  CheckSyn;
  rzBox.Clear; 
end;
Проверил ее через ShowMessage в самом конце - показывает. Значит ошибка не в ней. Пытаюсь найти где...
Может из-за привязки к фокусу...

Последний раз редактировалось kettanaito; 15.08.2011 в 17:17.
kettanaito вне форума Ответить с цитированием
Старый 15.08.2011, 17:19   #9
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

хотя неее, счас подумал сообщение отправляется не тому окну что запушено а самому себе, т.е. новое окно себе же посылает сообщение, она свой хендл находит
fate вне форума Ответить с цитированием
Старый 15.08.2011, 17:25   #10
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

fate, жаль я не прочитал это перед тем, как перерыл все процедуры программы в подозрениях проблемы А как тогда найти хендл именно первой запущенной программы?

(по поводу хендла ты прав, потому мне и казалось, что файл открывает FullOpen, а потом очищает. На самом деле поверх появлялось второе окно, в котором и выполнялся прием сообщения процедуры открытия, а потом это вторичное окно удалялось)

Последний раз редактировалось kettanaito; 15.08.2011 в 17:29.
kettanaito вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взаимодействие с игрой saylar_06 Общие вопросы Delphi 13 08.06.2011 14:35
Взаимодействие C# и 1с Sparky Свободное общение 1 05.02.2010 04:31
Взаимодействие приложений artemavd Общие вопросы Delphi 22 01.08.2009 20:09
uTorrent - взаимодействие SoulReaver Win Api 1 21.06.2009 20:06
Взаимодействие с пользователем Alone_Wolf Общие вопросы Delphi 19 23.12.2008 09:34