Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Запрет на запуск второй копии приложения


Автор: BlueAlien 21.10.2014, 23:57
Доброе время суток. У меня такая проблема: есть код, который должен помешать запускать программу дважды, на случать если юзверь щелкнет второй раз по иконке, программа не запускала свою вторую копию: 
Код

Procedure TForm1.FormCreate(SEnder: TObject);
 Var ExtEndedStyle:dword;
 Wnd : hWnd;
 buff : Array[0.. 127] of Char;
Begin
 Wnd := GetWindow(Handle, gw_HWndFirst);
 While Wnd <> 0
 DO
  Begin
  If (Wnd <> Application.Handle) and (GetWindow(Wnd, gw_Owner) = 0) Then 
   Begin 
   GetWindowText (Wnd, buff, sizeof (buff ));
   If StrPas (buff) = Application.Title Then
    Begin Halt;
    End;
   End;
  Wnd := GetWindow (Wnd, gw_hWndNext); 
  End;
End;

Но вот в чем проблема, когда я все это компилирую и запускаю, программа (первый запуск!), тут же вырубается сама. 

Автор: northener 22.10.2014, 01:51
Цитата(BlueAlien @  21.10.2014,  23:57 Найти цитируемый пост)
Доброе время суток. У меня такая проблема: есть код,

Странный какой-то код ты нарыл на всемирной помойке.
Ну так сам нарыл, сам и разбирайся. smile

Автор: Poseidon 22.10.2014, 14:15
BlueAlien, код, прямо скажем, бредовый. И программа очень правильно все делает когда вырубается. Проанализируй этот код и разберись что там делается, сам поймешь. Я б посоветовал бы использовать мютексы. http://pressdev.ru/zapreshhaem-zapusk-vtoroj-kopii-programmy-na-delphi/

Автор: кмс 23.10.2014, 11:42
Я так делал. Открываешь код проекта(Project>View Source) и там пишешь
Код

.........
var
  H: THandle;
.................

begin
  H := CreateMutex(nil, True, 'Bghfvgtrekjhgftuy');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    Exit;
  end;
end;
.........
.........

В место Bghfvgtrekjhgftuy можешь написать что угодно.

Автор: BlueAlien 23.10.2014, 16:10
Цитата(кмс @  23.10.2014,  11:42 Найти цитируемый пост)
В место Bghfvgtrekjhgftuy можешь написать что угодно.

Вы имеете в виду - имя моего приложения? 

Автор: Poseidon 23.10.2014, 16:36
Цитата(BlueAlien @  23.10.2014,  16:10 Найти цитируемый пост)
Вы имеете в виду - имя моего приложения?  
Он имеет ввиду "что угодно". Я же ссылку дал, читал что там? Вот тебе дословно: 
Цитата
в самой первой строке, когда мы создаем мьютекс, я указал «кодовое слов» — это то слово, которое будет использоваться в Вашей программы и только она его будет знать. Так что придумайте его и впишите туда.


кмс, присваивать значение для H в данном случае не требуется. А следовательно и объявлять H нет необходимости.

Автор: CynicRus 23.10.2014, 22:24
Можешь там просто ctrl + shift + G нажать, и среда сама тебе сгенерит строку с GUID, если фантазировать в лом.

Ну и выглядеть тогда это будет примерно так:
Код

if CreateMutex(nil, True, '6EACD0BF-F3E0-44D9-91E7-47467B5A2B6A') = 0 then
  RaiseLastOSError;
if GetLastError = ERROR_ALREADY_EXISTS then
  Exit;

Автор: кмс 24.10.2014, 14:00
Цитата(Poseidon @  23.10.2014,  16:36 Найти цитируемый пост)
кмс, присваивать значение для H в данном случае не требуется. А следовательно и объявлять H нет необходимости.

Ну я сам давно подсмотрел где то, сейчас просто тот проект нашел и скопировал smile

Автор: BlueAlien 24.10.2014, 20:05
Poseidon, хватит кидать ссылки на нерабочие примеры, писаные криворукими школярами. 


Цитата(Poseidon @  23.10.2014,  16:36 Найти цитируемый пост)
Он имеет ввиду "что угодно". 

Но ведь это "кодовое слово", оно ведь еще где-то использоваться будет, верно?

Добавлено через 1 минуту и 42 секунды
кмс, а ваш код, даже не компилируется. 

Автор: Poseidon 24.10.2014, 20:33
Цитата(BlueAlien @  24.10.2014,  20:05 Найти цитируемый пост)
Но ведь это "кодовое слово", оно ведь еще где-то использоваться будет, верно?
Верно. Оно будет использоваться при запуске второй копии программы. Вы вообще код удосужились посмотреть? Изучить что он делает? Почему так происходит? Эти вопросы отпали бы все. Разжовывать тут и класть в рот никто не будет. Если сами не хотите разбираться, то вам прямиком на фриланс. Примеры все рабочие и использованы в не одном проекте. Если они не делают конкретно то, чт нужно вам, то это еще не говорит о том, что они не работают. Попробуйте разобраться что делает код. Тогда и поправить его под свои нужды будет проще. Обычным копи-пастом тут не обойтись.

Автор: bems 25.10.2014, 14:09
кмс, а почему именно мютекс? считается что ивент "легче"

Добавлено через 3 минуты и 58 секунд
Цитата(BlueAlien @  24.10.2014,  20:05 Найти цитируемый пост)
кмс, а ваш код, даже не компилируется
вы не вполне верно сформулировали высказывание. правильно было бы "мне не удалось скомпилировать ваш код"

Автор: BlueAlien 31.10.2014, 02:36
Цитата(Poseidon @  24.10.2014,  20:33 Найти цитируемый пост)
Примеры все рабочие и использованы в не одном проекте. 

Примеры не рабочие. Сомневаюсь, что они могут использоваться хоть где-нибудь, кроме троллинга. 

Цитата(Poseidon @  24.10.2014,  20:33 Найти цитируемый пост)
Если они не делают конкретно то, чт нужно вам, то это еще не говорит о том, что они не работают.

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

Цитата(Poseidon @  24.10.2014,  20:33 Найти цитируемый пост)
Попробуйте разобраться что делает код.

Если бы я хотел играть в шарады, то я бы и пошел туда где в них играют. Мне нужен - рабочий код.

Цитата(bems @  25.10.2014,  14:09 Найти цитируемый пост)
вы не вполне верно сформулировали высказывание. правильно было бы "мне не удалось скомпилировать ваш код"

Код либо компилируется, либо нет. Если правильный - компилируется. Все коды, которые мне здесь дали - не компилируются, следовательно, неправильные. 

Автор: Poseidon 31.10.2014, 08:46

M
Poseidon
Тема закрыта в связи с нежеланием автора разобраться в вопросе.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)