как запретить запуск нескольких копий программ?
Участников: 4
FreeBasic :: Программирование :: Общее
Страница 1 из 1
как запретить запуск нескольких копий программ?
короче говоря, я хочу запускать одну копию программы. как это сотворить на FreeBasic. на vb, это делается одной строкой, а вот на FreeBasic, надо будет помудрить.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как запретить запуск нескольких копий программ?
я бы сделал поиск хендлов всех окон, по ним бы получал название класса окна, и если оно совпадало бы с моим, то завершаем программу
Re: как запретить запуск нескольких копий программ?
а если это консольное приложение? там класс окна всегда один и тот же. вот под dos, все было проще, пишем в память определенные цифры, типа проверочных, а ри запуске второй копии нашего резидента, проверялись наши циферки.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как запретить запуск нескольких копий программ?
Есть вариант узнать число копий запущенной программы с помощью мьютексов, но приведённый ниже код работает только под 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
Re: как запретить запуск нескольких копий программ?
З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
код:
#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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как запретить запуск нескольких копий программ?
А можно сделать гораздо проще:
- Код:
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
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: как запретить запуск нескольких копий программ?
тоже вариант, но так возникает несколько проблем: не всегда прога может быть запущена опять из текущей директории, а если файл сохранять на какоето фиксированное место, то нет гарантий, что там будет доступ на запись (в часности это касается Линукса); если вдруг прога вылетела раньше времени, или была принудительно завершена из опреационки, то файл останется, и заново запустить прогу не получится
Re: как запретить запуск нескольких копий программ?
А если сделать что бы ON ERROR выполнял удаление файла?
А путь, в принципе, может быть просто не указан - тогда в корневой папке будет этот файл.
Если всё это сделать, то по идее должно работать(не идеально =) ).
Или, на худой конец, спрашивать: "Эта программа уже запущена.Вы хотите запустить ещё одну копию? <Да> <Нет>"
А путь, в принципе, может быть просто не указан - тогда в корневой папке будет этот файл.
Если всё это сделать, то по идее должно работать(не идеально =) ).
Или, на худой конец, спрашивать: "Эта программа уже запущена.Вы хотите запустить ещё одну копию? <Да> <Нет>"
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: как запретить запуск нескольких копий программ?
привет. да, пример отображает всегда ожну копию программы, но нам всего лишь надо запретить повторный запуск. идея с файлами, мне приходила в голову, но я за то, чем меньше всяких левых файлов в программе, тем лучше. вообще, потом попробую разобраться, чтоб запрет можно было делать только средствами FreeBasic, чтоб в винде и в linuxе работало.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|