Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.16;
Скачать: CL | DM;

Вниз

Как закрыть открытую копию приложения при его запуске.   Найти похожие ветки 

 
Князев Сергей   (2003-11-19 17:44) [0]

Запускаю приложение, определяю через созданный Mutex, что приложение уже запущено. Как его открытую копию закрыть и не запускать так же и вторую копию. Другими словами повторный запуск приложения закрывает уже запущенную копию. В первой копии открыт файл, надо бы и его наверное закрыть. Сейчас вот так, но выпадает ошибка и первая копия не закрывается:

function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, "MonitorMutex");
Result := (HM <> 0);
if HM = 0 then HM := CreateMutex(nil, false, "MonitorMutex")
end;

begin
if Check then
begin
// PostMessage(HM, WM_QUIT, 0, 0);
PostMessage(FindWindow(nil, "Monitor"), WM_QUIT, 0, 0);
Exit;
end;

fs := TFileStream.Create("C:\Temp\Test.txt", fmOpenReadWrite or fmShareExclusive);
while True do Sleep(1000);
end.

Чего не так. Ошибка, что мол файлик открыт. Может ловить сообщение WM_QUIT еще надо и в нем закрывать, но как, подсобите, пожалуйста.


 
Reindeer Moss Eater ©   (2003-11-19 17:45) [1]

Удалено модератором


 
Князев Сергей   (2003-11-19 17:46) [2]

Удалено модератором


 
Skier ©   (2003-11-19 17:46) [3]

SendMessage(FindWindow(nil, "Monitor"), WM_QUIT, 0, 0);


 
Князев Сергей   (2003-11-19 17:52) [4]


> Skier © (19.11.03 17:46) [3]



> SendMessage(FindWindow(nil, "Monitor"), WM_QUIT, 0, 0);


Такое не катит вааще ничего не происходит


 
Skier ©   (2003-11-19 17:53) [5]

хм...
а FindWindow(nil, "Monitor") что возвращает ? Проверял ?


 
Князев Сергей   (2003-11-19 17:56) [6]


> хм...
> а FindWindow(nil, "Monitor") что возвращает ? Проверял ?


65666


 
Skier ©   (2003-11-19 18:02) [7]

SendMessage(FindWindow(nil, "Monitor"), WM_ CLOSE, 0, 0); ?


 
Reindeer Moss Eater ©   (2003-11-19 22:45) [8]

Первая запущенная копия приложения создает мьютекс и открывает файл. Вторая копия приложения принудительно завершает выполнение первой копии. Интересно какая роль будет отведена третьей запускаемой копии приложения, а так же всем последующим.

PS а инжекторов все же жаль.... они же ни в чем не виноваты.


 
Князев Сергей   (2003-11-20 08:05) [9]


> Первая запущенная копия приложения создает мьютекс и открывает
> файл. Вторая копия приложения принудительно завершает выполнение
> первой копии. Интересно какая роль будет отведена третьей
> запускаемой копии приложения, а так же всем последующим.

Третья копия, увидев, что приложения нет в памяти, сама туда залезет и будет сидеть пока не запустится четвертая и т.д.

> PS а инжекторов все же жаль.... они же ни в чем не виноваты.

Хорош издеваться, это все для их безопасности и делается.


 
Князев Сергей   (2003-11-20 08:12) [10]

Вот полная версия программки:

program Monitor;

uses
Forms,
windows,
classes,
SysUtils,
messages;

{$R *.RES}

var HM: THandle;
fs: TFileStream;

function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, "MonitorMutex");
Result := (HM <> 0);
if HM = 0 then HM := CreateMutex(nil, false, "MonitorMutex")
end;

begin
if Check then
begin
SendMessage((FindWindow(nil, "Monitor")), WM_CLOSE, 0, 0);
Exit;
end;

fs := TFileStream.Create("C:\Temp\Test.txt", fmOpenReadWrite or fmShareExclusive);
while True do Sleep(1000);
end.



Почему FindWindow(nil, "Monitor") . Так ведь называется сама программа. Ни одного окна нет, правильно ли так искать копию для закрытия. А нельзя использовать хэндл мутекса, здесь НМ, а то не получается программа не закрывается, а остается в памяти.


 
Князев Сергей   (2003-11-20 09:03) [11]

Ну че, никто не знает как закрыть программку, висящую в памяти без нажатия Ctrl+Alt+Del.


 
Reindeer Moss Eater ©   (2003-11-20 09:20) [12]

А зачем её (первую копию) вообще запускать, если любой(!!!) повторный запуск, когда бы он ни произошел, должен убить первую копию и завершить работу самому?

Ты хоть немного над смыслом задумываешся?


 
TUser ©   (2003-11-20 09:35) [13]

Может прописать в проге реакцию на какой-нибудь WM_COMMAND в виде
application.Terminate.
И при открытии искать какое-нибудь окошко твоей проги, а потом засылать туда WM_COMMAND с соотв. параметром.


 
Князев Сергей   (2003-11-20 10:15) [14]


> И при открытии искать какое-нибудь окошко твоей проги

Окон нету. Каким образом ее найти-то.


> А зачем её (первую копию) вообще запускать, если любой(!!!)
> повторный запуск, когда бы он ни произошел, должен убить
> первую копию и завершить работу самому?

При первом запуске прога держит файлик и не дает с ним работать ни копирнуть его, ни открыть, ни чего нельзя сделать. Чувак приходит с дискетой на которой записана эта прога, запускает ее и снимается ограничение с файла. Другой вариант прога запускается с паролем.

> Reindeer Moss Eater ©

Ты чего опять дебаты полез разводить. Отвечай на вопрос и не придирайся. Спасибо.


 
Reindeer Moss Eater ©   (2003-11-20 10:21) [15]

При первом запуске прога держит файлик и не дает с ним работать ни копирнуть его, ни открыть, ни чего нельзя сделать. Чувак приходит с дискетой на которой записана эта прога, запускает ее и снимается ограничение с файла. Другой вариант прога запускается с паролем.

Вот я и хочу выяснить, зачем и с каким смыслом первая прога держала файл, если любой подошедший чувак с такой же прогой в легкую вызывает смерть первой программы.


 
Erik ©   (2003-11-20 10:36) [16]

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

P.S
А что за инжекторы интересно? :)


 
Князев Сергей   (2003-11-20 10:46) [17]

Удалено модератором


 
Danilka ©   (2003-11-20 10:53) [18]

Удалено модератором


 
Danilka ©   (2003-11-20 10:55) [19]

Князев Сергей
слушай, а может проще сделать, залить на компашку и программу и файло, пусть адмынЪ запускает прогу с компашки, вынимает ее и кладет в карман, на компе никакое файло и не надо будет оставлять.
и безопастность будет ойейей какая. просто супер.


 
Князев Сергей   (2003-11-20 11:04) [20]

Удалено модератором


 
Danilka ©   (2003-11-20 11:05) [21]

Удалено модератором


 
Князев Сергей   (2003-11-20 11:25) [22]

Ладно, объясняю доходчиво, надеюсь.
Особенно это касается Reindeer Moss Eater

Есть автосервис, в нем стоит стенд с постоянно включенным
компутером, к которому подъезжает машина. В нее
закачивается из компутера файлик. Эта процедура стоит
немалых денег. Человек, который отвечает за этот стенд с
компутером не хочет, чтоб в его отсутствие кто-то "срубил"
денег "по-левому", поэтому перед своим уходом домой он со
своей (в единственном виде существующей) дискеты грузит
прогу, которая при первом запуске занимает файлик и не
дает его использовать. Когда он возвращается на работу, то
снова с дискеты загружает прогу, при втором ее запуске она
снимает блокировку с файлика и дает возможность закачивать
этот файлик в машинку, причем прога убирается из памяти
(вот это мне и надо). Перед уходом домой человек опять
грузит прогу, а она опять блокирует файлик. Прогу можно
снять только при нажатии Ctrl+Alt+Del или при
перезагрузке, но ни того ни другого никто больше делать не
умеет. Если компутер зависает, то все ждут этого человека.
Как-то получить комуто эту прогу нельзя потому как никто
там даже не знает, что такое дискета. Компутер остается
работать для того, чтобы можно было осуществлять другие
бесплатные функции, например какое-то тестирование. Все
остальные, имеющие доступ к этому компутеру знают только,
что для тестирования надо нажать кнопку "тестирование",
для загрузки файла в машину кнопку "загрузка" и т.д. и
т.п. Какие здесь могут быть пробелы в защите, а?


 
Danilka ©   (2003-11-20 11:32) [23]

[22] Князев Сергей (20.11.03 11:25)
>Прогу можно снять только при нажатии Ctrl+Alt+Del или при
>перезагрузке, но ни того ни другого никто больше делать не
>умеет.

Пробелы элементарные, если сейчас никто не умеет, то через неделю максимум, уметь будет половина коллектива люди быстро учатся когда есть денежный стимул, особенно с учетом: "процедура стоит немалых денег", у людей, например, наверняка есть дети, которые не только дискетки видели.
Ответь, пожалуйста на 2 вопроса:
1. нафига с дискетки сливать файлик сикретный на комп, нельзя его прямо оттуда заюзать?
2. и чем тебе не нравится вариант с компашкой?

тогда у людей не будет ни файлика, ни даже программы.


 
Владимир Челабчи   (2003-11-20 11:36) [24]

Если нужно програмно заблокировать доступ к файлу то можно воспользоваться интерфейсом Exploer"а, точно не помню какой, а в книге Елмановой "Delphi 6 COM+" эта технология описана глава 9


 
han_malign ©   (2003-11-20 11:43) [25]

Именованным может быть не только мьютекс...

uses Windows;
var hE,hF: THandle;
begin
hE:=OpenEvent(EVENT_ALL_ACCESS,false,"MonitorEvent");
if(hE<>0)then SetEvent(hE)
else begin
hE:=CreateEvent(nil,true,false,"MonitorEvent");
hF:=CreateFile("C:\Temp\Test.txt",GENERIC_READ or GENERIC_WRITE,nil,0,OPEN_EXISTING,0,0);
WaitForSingleObject(hE,INFINITE);
CloseHandle(hF);
end;
CloseHandle(hE);
end;

- не помешает добавить проверку ошибок, но это уж сам...


 
Князев Сергей   (2003-11-20 11:45) [26]


> 1. нафига с дискетки сливать файлик сикретный на комп, нельзя
> его прямо оттуда заюзать?

Так файлик и будет юзаться с компа, на дискете будет программка блокиратор/разблокиратор. Если б с дискеты, то и говорить не очем было бы.

> 2. и чем тебе не нравится вариант с компашкой?

А если там нет компашкного привода.

> через неделю максимум, уметь будет половина коллектива

Если ответственный человек придет и увидит, что в памяти нету проги-блокиратора, то будет очевидно, что кто-то в его отсутствие залил файлик в машинку, поэтому пойдут штрафные санкции для тех, кто находился в фирме в его отсутствие.
Ладно, мы отвлеклись от сути вопроса, как программно снять прогу висящую в памяти.


 
Reindeer Moss Eater ©   (2003-11-20 11:49) [27]

Есть автосервис, в нем стоит стенд с постоянно включенным
компутером, к которому подъезжает машина. В нее
закачивается из компутера файлик.


Так наверное не по воздуху закачивается, а по каким-то проводам.
Может человеку отвечающему за прошивку уносить провода домой?

Далее.
Программа установлена на жестком диске или на дискете?
Программа в качестве файла прошивки может использовать любой подсунутый файл или нет?

А все, что придумано тобой для защиты - курам насмех.
Все основано на том, что кто-то ничего не знает и никогда ничего не будет делать чего система защиты не предполагает.
Например нажатия ресета.


 
han_malign ©   (2003-11-20 11:50) [28]

З.Ы. А в добавок к CreateFile, файлик можно закриптовать, и раскриптовать после WaitForSingleObject - т.о. если задача была снята через менеджер задач, файл не раскрипуется. ТОЛЬКО появится еще один режим работы программы - проверка что файл зашифрован, и его надо просто расшифровать и выйти. Но тут уже появится вопрос, а нужно ли тогда его вообще блокировать, если он будет зашифрован....


 
Reindeer Moss Eater ©   (2003-11-20 11:52) [29]

А зачем блокировать файл, который только у ответработника на дискете и больше ни у кого?


 
Князев Сергей   (2003-11-20 12:01) [30]


> Reindeer Moss Eater © (20.11.03 11:52) [29]
> А зачем блокировать файл, который только у ответработника
> на дискете и больше ни у кого?

Ты бы мои ответы внимательней читал.

> han_malign ©

Единственный человек, который помог за два дня дебат. Спасибо огромное, насчет криптования подумаю.
Вот полный текст проги которая работает:

program Monitor;

uses
windows,
classes,
SysUtils;

{$R *.RES}

var hE: THandle;
fs: TFileStream;
begin
hE:=OpenEvent(EVENT_ALL_ACCESS,false,"MonitorEvent");
if(hE<>0)then SetEvent(hE)
else begin
hE:=CreateEvent(nil,true,false,"MonitorEvent");
fs := TFileStream.Create("C:\Temp\Test.txt", fmOpenReadWrite or fmShareExclusive);
WaitForSingleObject(hE,INFINITE);
fs.Free;
end;
CloseHandle(hE);
end.


Всем спасибо, можно расходится.


 
han_malign ©   (2003-11-20 12:02) [31]

Кстати посмотрел, а кроме гонива, не увидел ни одного грамотного ответа почему не проходит команда WM_QUIT - грустно...

А не проходит она потому, что нет цикла обработки, этих самых, сообщений(Applicetion.Run), который завершается по, этой самой, команде, а есть другой цикл - вечный (while true do sleep), которому до одного места на любые команды...

З.Ы. Если спросили почему - то и ответить надо почему, а не как...


 
Danilka ©   (2003-11-20 12:04) [32]

ну ладно, сейчас разойдусь :))
а почему-бы просто программу не запускать из батника, которая после выхода из программы удаляла-бы файл?
вообще-то это выло во вчерашних "дебатах", причем 2 раза но ты так и не ответил.


 
Reindeer Moss Eater ©   (2003-11-20 12:08) [33]

han_malign ©

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

http://delphimaster.net/view/1-1069218713/


 
Князев Сергей   (2003-11-20 12:35) [34]


> Reindeer Moss Eater ©

Ты бы сначала разобрался, а потом строил бы из себя кого-то

> Danilka ©

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

> han_malign ©

за огневую и практическую поддержку.


 
cdadmitriy ©   (2003-11-20 12:43) [35]

> Князев Сергей

Ты посылаешь программе

SendMessage((FindWindow(nil, "Monitor")), WM_CLOSE, 0, 0);

а где закрытие по проги по WM_CLOSE или я не прав

-- запусти 2 DELPHI и проверь 1 эк. получает ли WM_CLOSE


 
Reindeer Moss Eater ©   (2003-11-20 12:44) [36]

Князев Сергей знаешь, что самое печальное и смешное во всей этой долгой истории?

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


 
cdadmitriy ©   (2003-11-20 13:18) [37]

Однократное использование файла

А почему не использовать DB с blob и все проблемы по доступу
ты решиш сам и примени шифровку и все дела ( открытие не поможет хакеру)


 
Dimaz   (2003-11-20 13:57) [38]

Halt;


 
Князев Сергей   (2003-11-20 17:58) [39]


> > Князев Сергей
>
> Ты посылаешь программе
>
> SendMessage((FindWindow(nil, "Monitor")), WM_CLOSE, 0, 0);
>
> а где закрытие по проги по WM_CLOSE или я не прав
>
> -- запусти 2 DELPHI и проверь 1 эк. получает ли WM_CLOSE


А зачем проблема ведь решена, ты запусти последний приведенный мною код, он работает больше мне ничего не надо.

> cdadmitriy © (20.11.03 13:18) [37]
> Однократное использование файла
>
> А почему не использовать DB с blob и все проблемы по доступу
> ты решиш сам и примени шифровку и все дела ( открытие не
> поможет хакеру)

И зачем мне такие крайности.

> Reindeer Moss Eater © (20.11.03 12:44) [36]
> Князев Сергей знаешь, что самое печальное и смешное во всей
> этой долгой истории?
>
> То, что один человек так и не понял, что ему пытались помочь
> решить существующую проблему попутно пытаясь помочь отказаться
> от реализации на практике алгоритмов, не имеющих отношения
> к решению этой проблемы.

Во время решения первой проблемы возникло другое решение, которое мне больше нравится. Если ты сможешь мне объяснить где можно обмануть эту прогу, если другого экземпляра нету ни у кого, тогда я все сделаю по твоему первому предложению.


 
Reindeer Moss Eater ©   (2003-11-20 18:05) [40]

если другого экземпляра нету ни у кого

Это твое мнение? Это объективная реальность?
Кто обеспечивает выполнение этого условия функционирования твоей защиты?

Что будет, если нажмут ресет на машине и перегрузят её?
Кто запустит защиту после перезагрузки?
Кто гарантирует и следит за тем, что бы персонал не сможет нажать три волшебные кнопки CAD?



Страницы: 1 2 вся ветка

Текущий архив: 2003.12.16;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.014 c
3-52055
Bless
2003-11-25 12:46
2003.12.16
Как правильно оформить транзакцию?


14-52367
copyr25
2003-11-22 21:25
2003.12.16
Шеварнадзе. Последний их ПолитБюро ЦК КПСС.


3-52079
_юзер_
2003-11-24 17:10
2003.12.16
и UPPER


4-52451
Talla2k
2003-10-22 21:45
2003.12.16
тормоз THREAD


14-52336
Cobalt
2003-11-23 13:53
2003.12.16
Взломали http://www.delphi-jedi.org/ ?