как запретить запуск нескольких копий программ?

Предыдущая тема Следующая тема Перейти вниз

как запретить запуск нескольких копий программ?

Сообщение  electrik в Сб Окт 25, 2008 6:01 pm

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  tux в Сб Окт 25, 2008 7:53 pm

я бы сделал поиск хендлов всех окон, по ним бы получал название класса окна, и если оно совпадало бы с моим, то завершаем программу
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  electrik в Вс Окт 26, 2008 10:40 am

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  Замабувараев в Вс Окт 26, 2008 4:22 pm

Есть вариант узнать число копий запущенной программы с помощью мьютексов, но приведённый ниже код работает только под Win32.

Код:

#include once "windows.bi"
' Функция, возвращающая число копий программы
Function GetNumberOfInstance() As Byte
   ' Имя мьютекса
   Dim strMutexName As ZString*6
   Dim intLastError, intRet, intMutex As Integer
   ' Счётчик копий программы
   Dim bytInst As Byte
   
   ' Обходим в цикле до тех пор, пока не отыщется свободный мьютекс
   intRet = 0
   Do
      ' Увеличиваем счётчик копий программы
      bytInst += 1
      ' Получаем имя мьютекса
      strMutexName ="CBCL" + Trim(Str(bytInst))
      ' Создаём мьютекс
      intMutex = CreateMutex(0, 0, @MutexName)
      ' Получаем код последней ошибки
      intLastError = GetLastError
      ' Проверяем идентификатор мьютекса
      If intMutex <> 0 Then
         ' Мьютекс создан
         ' Проверяем код ошибки
         If LastError = ERROR_ALREADY_EXISTS Then
            ' Создан существующий мьютекс
            intRet = 0
         Else
            ' Мьютекс создан успешно
            intRet = 1
         End If
      Else
         ' Мьютекс не создан
         intRet = FALSE
      End If
   Loop While intRet <> 0
   ' Возвращаем число копий программы
   Return bytInst
End Function
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  electrik в Вс Окт 26, 2008 7:09 pm

Зamabuvaraeu, огромное спасибо! были синтаксические ошибки, но не страшные, я их быстро отловил. я так понял, что рабочая программа должна выглядеть так:
код:
#include once "windows.bi"

declare Function GetNumberOfInstance() As Byte
dim numProgs as byte = GetNumberOfInstance()

if numProgs = 1 then
messagebox(0,"программа уже запущена, число копий " & numprogs,"сообщение",0)
end
end if
messagebox(0,"нажмите альт+таб, для того, чтобы попробовать запустить еще одну копию программы", "тестовая программа",0)


' Функция, возвращающая число копий программы
Function GetNumberOfInstance() As Byte
' Имя мьютекса
Dim strMutexName As ZString*9
Dim As Integer intLastError, intRet
dim as handle intMutex
' Счётчик копий программы
Dim bytInst As Byte

' Обходим в цикле до тех пор, пока не отыщется свободный мьютекс
intRet = 0
Do
' Увеличиваем счётчик копий программы
bytInst += 1
' Получаем имя мьютекса
strMutexName ="mymutex" + Trim(Str(bytInst))
' Создаём мьютекс
intMutex = CreateMutex(0, 0, @strMutexName)
' Получаем код последней ошибки
intLastError = GetLastError
' Проверяем идентификатор мьютекса
If intMutex <> 0 Then
' Мьютекс создан
' Проверяем код ошибки
If intLastError = ERROR_ALREADY_EXISTS Then
' Создан существующий мьютекс
intRet = 0
Else
' Мьютекс создан успешно
intRet = 1
End If
Else
' Мьютекс не создан
intRet = FALSE
End If
Loop While intRet <> 0
' Возвращаем число копий программы
Return bytInst
End Function

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  Gena в Чт Ноя 13, 2008 3:04 pm

А можно сделать гораздо проще:

Код:

Open path+"copies.txt" for input as #1
input #1, Q
if q = 1 then print "Данная программа уже запущена.":sleep:end
close #1
Open path+"copies.txt" for output as #1
print #1, 1
close #1
......
......
......
Open path+"copies.txt" for output as #1
print #1, 0
close #1
end
P.S. В предыдущем примере неправильно отображается число копий - всё время 1.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  tux в Чт Ноя 13, 2008 7:49 pm

тоже вариант, но так возникает несколько проблем: не всегда прога может быть запущена опять из текущей директории, а если файл сохранять на какоето фиксированное место, то нет гарантий, что там будет доступ на запись (в часности это касается Линукса); если вдруг прога вылетела раньше времени, или была принудительно завершена из опреационки, то файл останется, и заново запустить прогу не получится
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  Gena в Пт Ноя 14, 2008 9:46 am

А если сделать что бы ON ERROR выполнял удаление файла?
А путь, в принципе, может быть просто не указан - тогда в корневой папке будет этот файл.
Если всё это сделать, то по идее должно работать(не идеально =) ).
Или, на худой конец, спрашивать: "Эта программа уже запущена.Вы хотите запустить ещё одну копию? <Да> <Нет>"

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  electrik в Вт Ноя 18, 2008 7:29 pm

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: как запретить запуск нескольких копий программ?

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения