Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 53 • Страница 2 из 3<  1  2  3  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Avaddon Ну разницы нету где хранить :). HWND в данном случае глобальный, но на время работы копии программы :). И в данной ситуации самый простейший способ решить проблему. Чем мучаться с передором тучи окон.



Партнер
 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Ray Adams
Согласен с тобой. Но с мьютексом и корректным SIGTERM красивее и правильней :)

_________________
Цель жизни - d20 по жизни...


 

Junior
Статус: Не в сети
Регистрация: 24.03.2004
HANDLE fm;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
char ss[]="MY_FAKIN_SUPA_SWAP";
DWORD pid;
fm=OpenFileMapping(FILE_MAP_READ,0,ss);
if (fm)
{
ShowMessage("Same_app_ditectid");
CopyMemory(&pid,MapViewOfFile(fm,FILE_MAP_READ,0,0,sizeof(DWORD)),sizeof(DWORD));
ShowMessage("Gonna_kill_that_shit -> " + AnsiString(pid));
if (TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,0,pid),0)) ShowMessage("terminated");
};
CloseHandle(fm);
fm=OpenFileMapping(FILE_MAP_READ,0,ss);
if (fm)
{
ShowMessage("shit_happens");
return;
}
CloseHandle(fm);
fm=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(DWORD),ss);
if (fm) ShowMessage("page_file_redi");
pid=GetCurrentProcessId();
CopyMemory(MapViewOfFile(fm,FILE_MAP_WRITE,0,0,sizeof(DWORD)),&pid,sizeof(DWORD));
Label1->Caption=pid;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
CloseHandle(fm);
}
//---------------------------------------------------------------------------


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
r9500_nonpro И зачем так сложно???

Avaddon Насчет мутекса я не совсем понял как ты собираешся это сделать. Я к примеру всегда использую мутексы , чтобы не запускать вторую копию программы, а вот в этой ситуации как оно/она/они , ну мутексы эти, смогут помочь? :)


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Есть такой зверь - DDK. Так вот, в нем есть файлик vmm.inc.
А в нем - чудесная функция - _GetMutexOwner.
Она возвращает хэндл процесса-владельца мутекса.
Дальше - по тексту :)

P.S. Эта функция, к стати, описана в MSDN, только очень невнятно. На уровне, мол есть такая..


 

Member
Статус: Не в сети
Регистрация: 14.04.2003
Откуда: Минск, Беларусь
Avaddon
Цитата:
Есть такой зверь - DDK. Так вот, в нем есть файлик vmm.inc.
Это простите какой такой DDK? Уж не серии ли 9x? А портируемость?
Цитата:
Она возвращает хэндл процесса-владельца мутекса.
В стандарте Win32 API выяснить текущего владельца мутекса нельзя. А то, что ты предлагаешь - от лукавого. Не искушай неокрепшие программистские души, особеннно там где без этого обойтись можно.
Цитата:
Эта функция, к стати, описана в MSDN, только очень невнятно. На уровне, мол есть такая
Неудивительно. Популяризировать нестандартные решения - неправильно.

Ray Adams
Цитата:
r9500_nonpro И зачем так сложно???
MMF - стандартный метод IPC. В отличие от реестра :)

_________________
"Помогите, 20 беспроводных мышей общаются сквозь стены!"
--- SweetLow ---


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Цитата:
MMF - стандартный метод IPC. В отличие от реестра

Да я все понимаю, но тут ведь конкретная ситуация наипростейщая и решается самыми простейшими методами!
Тут ничего не передается, ничего никуда не записываться, человеку просто надо закрыть первую копию :).


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
SweetLow
Смотрел в DDK 98, 2000, XP функция присутствует везде.

_________________
Цель жизни - d20 по жизни...


 

Member
Статус: Не в сети
Регистрация: 14.04.2003
Откуда: Минск, Беларусь
Avaddon
Цитата:
Смотрел в DDK 98, 2000, XP функция присутствует везде.
В VMM.INC - я чего то в жизни не понимаю, но какой может быть VMM.INC если самого VMM в линейке NT в принципе быть не может? Нету там Virtual Machine(or Memory) Manаger.

Или ты мне про
\NTDDK\inc\win_me\vmm.h
все пытаешься рассказать??? Так он к NTевому DDK самое отдаленное отношение имеет. Уж поверь, код на линейке NT _не заработает_.

_________________
"Помогите, 20 беспроводных мышей общаются сквозь стены!"
--- SweetLow ---


Последний раз редактировалось SweetLow 18.05.2004 10:12, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
SweetLow
Ты прав, я ошибался. Действительно, под NT линейкой это не работает.
Честно говоря, под 2000 я это и не тестировал. :(

_________________
Цель жизни - d20 по жизни...


 

Member
Статус: Не в сети
Регистрация: 31.12.2003
Откуда: Жукова
Кому интересно - решил проблему так(пишу так, как хотел бы, чтобы писали мне):


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, shellapi;

var
Form1: TForm1;
wnd:hwnd;
f:textfile; w:string;
path:string; ti:integer;

function GetExePath:string;
begin
Result:=ExtractFilePath(paramstr(0));
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
ti:=5;
path:=GetExePath+'2.str';
assignfile(f,path);
if FileExists(path) then begin
reset(f);
readln(f,w);
readln(f,ti);
if ti<60 then
ti:=ti+15
else ti:=5;
closefile(f);
erase(f);
wnd:=strtoint(w);
postMessage(wnd, WM_QUIT, 0, 0);
wnd:=getwindow(Handle, GW_OWNER);
rewrite(f);
w:=inttostr(wnd);
writeln(f,w);
writeln(f,ti);
closefile(f);
end
else begin
wnd:=getwindow(Handle, GW_OWNER);
w:=inttostr(wnd);
rewrite(f);
APPEND(f);
writeln(f,w);
writeln(f,ti);
closefile(f);
end;
showmessage(inttostr(ti));

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if FileExists(path) then erase(f);
end;

end.


Теперь как сделать так, чтобы файл создавался в оперативке?


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Цитата:
wnd:=getwindow(Handle, GW_OWNER);

Зачем? Ведь есть переменнач Handle - несет HWND твоего окна, и опять же ну зачем так все смложно не понимаю :) Предложил же тебе наиболее простейший способ, сохрани в реестре Handle первого окна и второй копией проверяй и закрывай его!
Если ты хочеш сделать файл в памяти так, чтобы другая копия его смогла прочесть, то это не такой простой способ как кажется :).
Тут у меня мысль пришла! А может ты просто не знаеш как работать с реестром? Ты скажи , поможем :)


 

Member
Статус: Не в сети
Регистрация: 23.09.2003
Откуда: South Ural
Ray Adams
Цитата:
Предложил же тебе наиболее простейший способ, сохрани в реестре Handle первого окна и второй копией проверяй и закрывай его!

не изобретайте велосипеда - хендлы имеют смысл только в рамках своего процесса, так что вполне может оказаться, что они совпадут :D

_________________
http://stargaz0r.nm.ru
http://people.overclockers.ru/StarGaz0r/files


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Цитата:
хендлы имеют смысл только в рамках своего процесса, так что вполне может оказаться, что они совпадут

Ай ай ай! Как же так :), HWND глобален и совпасть он никак не может :)

Добавлено спустя 2 минуты, 14 секунд:
Иначе на кой тогда вообще такие функции как FindWindow к примеру :)


 

Member
Статус: Не в сети
Регистрация: 23.09.2003
Откуда: South Ural
Ray Adams
HWND - исключение из общего правила - он глобальный, но в любом случае это не есть правильный метод interprocess communication; для этого сущетвуют специальные объекты - например мьютексы

_________________
http://stargaz0r.nm.ru
http://people.overclockers.ru/StarGaz0r/files


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Цитата:
HWND - исключение из общего правила

Исключения их каких правил? HWND также как и ProcessID всега глобален :), я предлагаю наипростейший метод, учитывая что человеку трудно работать с изощренными вариантами. А мутекс, ну обьясни ка народу как ты через мутекс закроеш первую копию? :)


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Ray Adams
На тему мутексов - уже обсуждали, я был не прав. Точнее, не совсем прав. Приведенный мной код работы через мутекс работает только на платформе Win9X/ME.

_________________
Цель жизни - d20 по жизни...


 

Member
Статус: Не в сети
Регистрация: 23.09.2003
Откуда: South Ural
Ray Adams
исключение из правила локальности всех остальных хендлов.
сценарий может быть следующим:
программа при запуске проверяет - существует ли мьютекс с данным именем - если есть то закрывает его - имеем вторую копию (если нету - создает и устанавливает обработчик на таймер - первая копия), а первая копия в обработчике таймера обнаружив что мьютекс закрыли сама закрывается
(как избегать коллизий сами придумаете)

_________________
http://stargaz0r.nm.ru
http://people.overclockers.ru/StarGaz0r/files


 

Member
Статус: Не в сети
Регистрация: 30.01.2003
Откуда: Москва
Хм. А как насчет броадкастить какой-нибудь WM_USER+xxx, а на его обработку поставить закрытие, если хендл окна посылающего не совпадает с хэндлом собственным?

_________________
#77


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Asteroid
Не, ну тогда можно сразу энумерейтить процессы и отстреливать тех, PID которых не совпадает с собственным :)

_________________
Цель жизни - d20 по жизни...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 53 • Страница 2 из 3<  1  2  3  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan