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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача инфы для предыдущей инстанции 
:(
    Опции темы
December
Дата 3.7.2005, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

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



Greetings All!
Подскажите верное направление.
Суть задачи: при попытке запуска второй инстанции программы нужно как-то передать строку предыдущей инстанции и закрыться. Наличие уже запущенной копии определяю с помощью мьютекса. А вот как передать информационную строку? Сейчас я сохраняю Handle приложения в реестре и делаю ему PostMessage, но чувствую, что это кривое решение. А как правильно? Есть идеи?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
rsm
Дата 4.7.2005, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно попробовать воспользоваться механизмом отправки сообщений всем программам в системе. Реализуется это так:
Код

// клиент
var
msg: DWORD;

const
messg = 'MEIN_MESSAGE';

InitCommonControls();
msg:= RegisterWindowMessage(messg);

// посылаем вообщение
SendMessage(HWND_BROADCAST, msg, data, 0);

Код

// сервер
var
msg: DWORD;

const
messg = 'MEIN_MESSAGE';

InitCommonControls();
msg:= RegisterWindowMessage(messg);

// прием сообщения реализуем в оконной функции WindowProc
function WindowProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case uMsg of:
mesg: 
begin
wsprintf(buff, "Data = %d", wParam);
MessageBox(hWnd, buff, nil, 0);
end;

Статья об этом способе. Правда исходники там на Ассемблере но они очень простые, можно разобраться.
PM MAIL   Вверх
SoWa
Дата 4.7.2005, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

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



А еще говорят, что компоненты DDE на вкладке System служат для обмена данными между программами. ЗЫ я их не использовал, не умею(еще не умею).


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Rrader
  Дата 4.7.2005, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Цитата

Сейчас я сохраняю Handle приложения в реестре

А зачем? Ведь можно FindWindow...
А строку символическим числом заменить нельзя? smile

Это сообщение отредактировал(а) Rrader - 4.7.2005, 06:46


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
December
Дата 4.7.2005, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

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



Цитата(Rrader @ 4.7.2005, 06:23)
А зачем? Ведь можно FindWindow...

По caption'y что ли? Он у меня не постоянный.

Цитата(Rrader @ 4.7.2005, 06:23)
А строку символическим числом заменить нельзя?

Нет, это может быть, к примеру, имя произвольного файла.
Добавлено @ 09:35
Цитата(SoWa @ 4.7.2005, 05:33)
А еще говорят, что компоненты DDE на вкладке System служат для обмена данными между программами. ЗЫ я их не использовал, не умею(еще не умею).

Хочется чего-то низкоуровневого... Винапишного...
rsm
Интересная ссылка, поизучаем...


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
December
Дата 4.7.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

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



rsm
Статья, хоть и интересная, не даёт ответа на вопроса. BROADCAST - ИМХО плохой тон, а иные способы в статье не рассматриваются. Зато там есть упоминание о WM_COPYDATA - это уже интереснее...


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Петрович
Дата 4.7.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



Посмотри такой код, может пригодится smile. Особо обрати внимание на CheckOneInstance (в конце). Выдрал из своей библиотеки, так что извини ежели что не так:
Код

{ tHandledObject }

{ This is a generic class for all encapsulated WinAPI's which need to call
  CloseHandle when no longer needed.  This code eliminates the need for
  3 identical destructors in the TEvent, TMutex, and TSharedMem classes
  which are descended from this class. }

  tHandledObject = class(tObject)
  protected
    fName  : String;
    fHandle: tHandle;
    fCreated: Boolean;
    procedure SetHandle(const aName :String; aHandle : tHandle);
    procedure ErrorCreate;
  public
    destructor Destroy; override;
    property Name: string read fName;
    property Handle: tHandle read fHandle;
    property Created: Boolean read fCreated;
  end;

{ tSharedMem }

{ This class simplifies the process of creating a region of shared memory.
  In Win32, this is accomplished by using the CreateFileMapping and
  MapViewOfFile functions. }

  tSharedMem = class(tHandledObject)
  private
    fSize: Integer;
    fDataPtr: Pointer;
  public
    constructor Create(const aName: string; aSize: Integer);
    destructor Destroy; override;
    property Size: Integer read fSize;
    property DataPtr: Pointer read fDataPtr;
  end;

{ tHandledObject }

destructor tHandledObject.Destroy;
begin
  if fHandle <> 0 then  CloseHandle(fHandle);
end;

procedure tHandledObject.ErrorCreate;
resourcestring  sCreateObjectError = 'Ошибка создания %s(%s):'^M^J'%s';
begin
  raise eSharedResources.Create(Format(sCreateObjectError,[ClassName,fName,SysErrorMessage(GetLastError)]));
end;

procedure tHandledObject.SetHandle(const aName :String; aHandle : tHandle);
begin
  fName := aName;
  if aHandle = 0 then
    ErrorCreate;
  fHandle := aHandle;
  fCreated := GetLastError = 0;
end;



{ tSharedMem }

constructor tSharedMem.Create(const aName: string; aSize: Integer);
begin
  fSize := aSize;
  { CreateFileMapping, when called with $FFFFFFFF for the hanlde value,
    creates a region of shared memory }
  SetHandle(aName,CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
              aSize, PChar(aName)));
  { We still need to map a pointer to the handle of the shared memory region }
  fDataPtr := MapViewOfFile(fHandle, FILE_MAP_WRITE, 0, 0, aSize);
  if fDataPtr = nil then
    ErrorCreate;
end;

destructor TSharedMem.Destroy;
begin
  if fDataPtr <> nil then  UnmapViewOfFile(fDataPtr);
  inherited Destroy;
end;

var
  FirstInstance :tSharedMem;

procedure CheckOneInstance(const ApplicationName :String);
 // Проверяет что программа с идентификатором ApplicationName уже запущена.
 // Если это так, то предыдущий экземпляр "выталкивается" на поверхность и
 // выполняется Halt(1)
var HPtr: pHandle;
begin
  FirstInstance := tSharedMem.Create('PetrovichSoft_FirstInstace_'
       +AnsiUpperCase(StringReplace(ApplicationName,'\','/',[rfReplaceAll])),
                                         SizeOf(Application.Handle));
  HPtr := pHandle(FirstInstance.DataPtr);
  if  HPtr^ = 0  then  // это первый экземпляр программы в памяти?
    HPtr^ := Application.Handle  //да
  else begin  // нет, не первый. Вытащим первый на поверхность
    if IsIconic(HPtr^) then  ShowWindow(HPtr^, SW_RESTORE);
    SetForegroundWindow(HPtr^);
    Halt(1); // и отваливаем
  end;
end;



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Snowy
Дата 4.7.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(December @ 3.7.2005, 23:43)
Наличие уже запущенной копии определяю с помощью мьютекса.

Можно использовать не только мьютекс, а любой именованный объект ядра. В данном случае весьма подходит файл проецированный в память. Именованный объект в который можно засунуть любые данные:
Цитата
CreateFileMapping


Цитата(December @ 4.7.2005, 09:28)
А зачем? Ведь можно FindWindow...
По caption'y что ли? Он у меня не постоянный.

Нет, по классу. Назови главную форму, например MyUnicalForm99.
Теперь можешь искать FindWindow('TMyUnicalForm99',nil);
После этого можно слать текст через WM_SETTEXT
PM MAIL   Вверх
December
Дата 4.7.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

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



Цитата(Snowy @ 4.7.2005, 14:03)
Нет, по классу. Назови главную форму, например MyUnicalForm99.
Теперь можешь искать FindWindow('TMyUnicalForm99',nil);

Честно говоря, у меня главная форма так и называется - MainForm smile Переименовывать уже поздно. И я знаю ещё как минимум одну чужую прогу, у которой главная форма именуется точно также smile

ОК, всем спасибо за ответы, буду разбираться.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1024 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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