Форум: "Потрепаться";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
ВнизКак закрыть открытую копию приложения при его запуске. Найти похожие ветки
← →
Князев Сергей (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;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.008 c