Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
6-52320
John Smith
2003-10-20 11:14
2003.12.16
Работа с реестром Windows


14-52338
~GaMeRd~
2003-11-21 22:04
2003.12.16
компилятор


1-52277
Michail Fedorov
2003-12-03 13:06
2003.12.16
Список шрифтов в Combobox


14-52390
Владимир
2003-11-19 10:20
2003.12.16
Три закона Азимова


3-52059
aVast
2003-11-21 15:32
2003.12.16
Виснет IBServer.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский