Страница 1 из 1

Еще раз вопрос о запуске копии приложения

Добавлено: 15 Июнь 2006, 7:17
lexa
Уважаемые Мэтры Clarion-a, дайте совет начинающему.
Подскажите, пожалуйста, самый надежный способ обнаружения уже запущенного приложения до открытия Aplication. Самое основное - это должно работать при разных открытых профилях XP.

1.Использую DDE - компилятор ругается на якобы неописанные функции DDEClient и DDEServer, хотя я думаю, что это встроенные функции Clarion-а и их описывать не нужно.
2.Использую BeginUnique из LibSrc\C55UTIL.CLW - при запуске программы при достижение
CreateEvent(0,0,0,szEventName) Windows выдает ошибку и просит
выслать отчет в Microsoft.
3.Что такое mutex-ы и как с ними работать - я не знаю.

В VB эта задача решается очень просто->If App.PrevInstance Then End
Неужели в Clarion-е так все сложно.

И еще, если не сложно, два маленьких вопроса.
1.Как можно обнулить локатор(Filtered), чтобы Browse отобразил весь список и перепрыгнул на нужную мне запись?
2.Есть такой контрол DosFileLookup, а можно использовать аналогичное для записи файла?

У меня C55EE, XP-Prof-SP2
Заранее благодарен за помощь.

Добавлено: 15 Июнь 2006, 9:25
ru_alex
1.Использую DDE - компилятор ругается на якобы неописанные функции DDEClient и DDEServer, хотя я думаю, что это встроенные функции Clarion-а и их описывать не нужно.
include('dde.clw') в Inside Global MAP по-моему.
Как можно обнулить локатор(Filtered), чтобы Browse отобразил весь список и перепрыгнул на нужную мне запись?
В ABC очищаешь свойство класса Shadow и локатор перестраивается методом SET или RESET по-моему. А для позиционирования на нужной записи вроде как нужен метод BROWSE класса Fetch().

Добавлено: 15 Июнь 2006, 9:54
Admin
2.Есть такой контрол DosFileLookup, а можно использовать аналогичное для записи файла?
Только ручками или шаблоном от других разработчиков т.к. данный шаблон в режиме записи может работать начиная с C6

Re: Еще раз вопрос о запуске копии приложения

Добавлено: 15 Июнь 2006, 10:08
Yufil
lexa писал(а):Уважаемые Мэтры Clarion-a, дайте совет начинающему.
Подскажите, пожалуйста, самый надежный способ обнаружения уже запущенного приложения до открытия Aplication. Самое основное - это должно работать при разных открытых профилях XP.

1.Использую DDE - компилятор ругается на якобы неописанные функции DDEClient и DDEServer, хотя я думаю, что это встроенные функции Clarion-а и их описывать не нужно.

FreeABC Templates(http://www.authord.com/clarion) содержат подходящий шаблон. Именно на мьютексах. Для ABC-разработчика - must have

3.Что такое mutex-ы и как с ними работать - я не знаю.

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

mutex.wait - если мьютекс занят, подождать, пока освободится
mutex.trywait(n) - подождать указанное время и прочитать код завершения
mutex.release - освободить занятый


Заранее благодарен за помощь.

Добавлено: 15 Июнь 2006, 12:41
softcreator
lexa
Вообще-то проверять можно очень просто и руками :)
Вот пример кода:
в MAP-секции:
MODULE('WinAPI')
GetDesktopWindow(),UNSIGNED,PASCAL
SetProp(UNSIGNED,*CSTRING,UNSIGNED),BOOL,RAW,PROC,PASCAL,NAME('SetPropA')
GetProp(UNSIGNED,*CSTRING),UNSIGNED,RAW,PASCAL,NAME('GetPropA')
RemoveProp(UNSIGNED,*CSTRING),UNSIGNED,RAW,PROC,PASCAL,NAME('RemovePropA')
END

В секции данных первой процедуры:
LOC:cstProgramID CSTRING('<какое-то уникальное описание нашей проги>')
LOC:ulOtherInstance ULONG,AUTO

Код инициализации процедуры:
! Проверка наличия программы в памяти для предотвращения повторной загрузки
! проверяем установленное свойство
LOC:ulOtherInstance = GetProp(GetDesktopWindow(),LOC:cstProgramID)
IF LOC:ulOtherInstance <> 0
! Проп заргистрирован - проверим существет ли окно
IF SetForegroundWindow(LOC:ulOtherInstance)
! Действительно наше окно уже загружено - просто выходим
DO ProcedureReturn
ELSE
! Окна нет - скорее всего прога пошло обвалилась - грузимся дальше
RemoveProp(GetDesktopWindow(),LOC:cstProgramID)
END
END

Код после открытия окна:
! Установка свойства для проверки наличия программы в памяти
SetProp(GetDesktopWindow(),LOC:cstProgramID,Метка окна{PROP:Handle})

Код перед закрытием окна:
! Удаляем установленный нами прор
RemoveProp(GetDesktopWindow(),LOC:cstProgramID)

Добавлено: 16 Июнь 2006, 5:35
lexa
Спасибо за советы и нужные направления.
Все предложенные методы у меня заработали, но я не достиг основной
задачи - запретить запуск копии при смене пользователя!!!

Добавлено: 16 Июнь 2006, 6:53
Олег
Хм... Что-то я не совсем понял - при какой смене пользователя?! Или ты имеешь в виду возможность в XP одновременного выполнения нескольких сеансов под разными юзерами на одном компе? Если так, то, скорее всего, прийдется контролировать факт работы приложения через внешние условия. К примеру, через какой-либо сигнальный файл. Этот способ, кстати, работает всегда и везде (в сети, в том числе) - просто при запуске приложения пытаешься монопольно открыть какой-либо файл. Если получаешь ошибку отказа в доступе, то файл уже открыт первой копией приложения. Если файл не существует, то создаем и открываем его. Даже если прога "свалится" не успев закрыть этот файл, то Винда сама автоматом закроет его. Таки образом ты в любой момент, без лишних "напрягов" сможешь определить факт работы приложения.

Добавлено: 16 Июнь 2006, 8:16
lexa
Уважаемый БГ
Вы правильно меня поняли, именно сеансы разных пользователей на одном компьютере. Спасибо за совет. Просто и сердито.

Добавлено: 19 Июнь 2006, 4:22
lexa
Admin
А можно ли использовать этот шаблон в C55EE? Если можно, пожалуйста, отошлите.
У меня C55EE(ABC), XP-Prof-SP-2.
Заранее благодарен.
a_shumeyko@yahoo.com

Добавлено: 19 Июнь 2006, 10:06
Yufil
lexa писал(а):Admin
А можно ли использовать этот шаблон в C55EE? Если можно, пожалуйста, отошлите.
У меня C55EE(ABC), XP-Prof-SP-2.
Заранее благодарен.
a_shumeyko@yahoo.com
Этот - это какой?

Добавлено: 19 Июнь 2006, 23:25
lexa
Yufil
Имеется ввиду шаблон для записи файла (в C55EE шаблон открытия файла(DosFileLookUp) имеется, а аналогичный для записи -нет).
Мне подсказали, что в C6.2 аналогичный шаблон уже включен.
Можно ли подсунуть шаблон из C6.2 в С55, будет работать?

Добавлено: 21 Июнь 2006, 2:54
Олег
Шаблон DosFileLookUp предназначен ТОЛЬКО для выбора какого-либо файла (или каталога) с помощью СТАНДАРТНОГО диалога Винды. Кроме выбора уже имеющегося файла можно задать имя нового файла. Т.е. сам шаблон ТОЛЬКО вызывает стандартный Виндовый диалог и БОЛЬШЕ НИЧЕГО НЕ ДЕЛАЕТ! Соответственно, этот шаблон НЕ ОТКРЫВАЕТ файлы!
Поэтому и "непонятки" - ЧТО ТЫ ХОЧЕШЬ?!
Что значит "для записи файла"? Если имеется в виду - что-то писать в файл, то вопрос - что писать, в какой файл, в каком виде? Если данные типа какой-то Базы Данных, то - один подход, если просто писать текстовую инфу или битовую инфу потоково в файл - другой подход!
Вообщем, обрисуй более подробно свою задачу (или задумку).