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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
lexa
Посетитель
Сообщения: 25
Зарегистрирован: 03 Июнь 2006, 23:57
Откуда: Зимбабве

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

Сообщение 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
Заранее благодарен за помощь.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

1.Использую DDE - компилятор ругается на якобы неописанные функции DDEClient и DDEServer, хотя я думаю, что это встроенные функции Clarion-а и их описывать не нужно.
include('dde.clw') в Inside Global MAP по-моему.
Как можно обнулить локатор(Filtered), чтобы Browse отобразил весь список и перепрыгнул на нужную мне запись?
В ABC очищаешь свойство класса Shadow и локатор перестраивается методом SET или RESET по-моему. А для позиционирования на нужной записи вроде как нужен метод BROWSE класса Fetch().
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сообщение Admin »

2.Есть такой контрол DosFileLookup, а можно использовать аналогичное для записи файла?
Только ручками или шаблоном от других разработчиков т.к. данный шаблон в режиме записи может работать начиная с C6
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение 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 - освободить занятый


Заранее благодарен за помощь.
softcreator
Ветеран движения
Сообщения: 78
Зарегистрирован: 04 Август 2005, 9:35
Контактная информация:

Сообщение 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)
lexa
Посетитель
Сообщения: 25
Зарегистрирован: 03 Июнь 2006, 23:57
Откуда: Зимбабве

Сообщение lexa »

Спасибо за советы и нужные направления.
Все предложенные методы у меня заработали, но я не достиг основной
задачи - запретить запуск копии при смене пользователя!!!
Аватара пользователя
Олег
Ветеран движения
Сообщения: 122
Зарегистрирован: 16 Июль 2005, 2:35
Откуда: Москва
Контактная информация:

Сообщение Олег »

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

Сообщение lexa »

Уважаемый БГ
Вы правильно меня поняли, именно сеансы разных пользователей на одном компьютере. Спасибо за совет. Просто и сердито.
lexa
Посетитель
Сообщения: 25
Зарегистрирован: 03 Июнь 2006, 23:57
Откуда: Зимбабве

Сообщение lexa »

Admin
А можно ли использовать этот шаблон в C55EE? Если можно, пожалуйста, отошлите.
У меня C55EE(ABC), XP-Prof-SP-2.
Заранее благодарен.
a_shumeyko@yahoo.com
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сообщение Yufil »

lexa писал(а):Admin
А можно ли использовать этот шаблон в C55EE? Если можно, пожалуйста, отошлите.
У меня C55EE(ABC), XP-Prof-SP-2.
Заранее благодарен.
a_shumeyko@yahoo.com
Этот - это какой?
lexa
Посетитель
Сообщения: 25
Зарегистрирован: 03 Июнь 2006, 23:57
Откуда: Зимбабве

Сообщение lexa »

Yufil
Имеется ввиду шаблон для записи файла (в C55EE шаблон открытия файла(DosFileLookUp) имеется, а аналогичный для записи -нет).
Мне подсказали, что в C6.2 аналогичный шаблон уже включен.
Можно ли подсунуть шаблон из C6.2 в С55, будет работать?
Аватара пользователя
Олег
Ветеран движения
Сообщения: 122
Зарегистрирован: 16 Июль 2005, 2:35
Откуда: Москва
Контактная информация:

Сообщение Олег »

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