Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с WinAPI semaphore или подобное / 23 сообщений из 23, страница 1 из 1
09.04.2008, 00:31
    #35244108
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Привет!

Както заинтересовался такой темой - программу запускает загрузчик, который предварительно проверяет нет ли новой версии, затем обновляет если надо, затем запускает прогу. Это я нашел как сделать на фоксклубе.
Но теперь у меня возникла другая необходимость - хочу чтоб напрямую, мимо лоадера прога не запускалась. Сначала я просто придумал передавать спец. параметр в командную строку при запуске, но сразу так думал и сейчас хочется - создавать некий флажок в виндах. К примеру лоадер его создает, а прога при запуске проверяет есть ли оный, если нет - не запускаеццо, если есть - запускаеццо и убирает его. Таким флажком мог бы выступить semaphore, но как с ним работать - я не понял. На примере "как не дать прогу запустить дважды" я вижу как он создается, но при выходе из проги - он автоматом уничтожаеццо, наверное по принципу parent/child. Значит из лоадера вышли (он делает RUN /n и отваливаеццо) - флажка не стало - так не пойдет.

Может кто подсказать как решить такую задачу?

спасибо

вфп9
...
Рейтинг: 0 / 0
09.04.2008, 09:12
    #35244359
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
...
Рейтинг: 0 / 0
09.04.2008, 12:00
    #35244902
SoftParanoik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Старые добрые глобальные атомы (GlobalAddAtom, GlobalFindAtom и т.п.)
...
Рейтинг: 0 / 0
09.04.2008, 15:06
    #35245609
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
спасибо.

2PaulWist - Вы, видимо, имели в виду Mutex? Там небольшая проблема, которую можно превратить и в плюс - найти и убить мутекс потом можно только по хэндлу, который можно передать в командной строке! Ну и флажок еще надо выставить, что мутекс не принадлежит родаку, иначе оно вместе с лоадером откинеццо...

В отличие от атома, который ищется и убиваеццо как просто строка в таблице.
вот чего по атомам нарыл
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
** declare the windos api functions
declare integer GlobalAddAtom in win32api string
declare integer GlobalFindAtom in win32api string
declare integer GlobalDeleteAtom in win32api integer

* need a location to hold the atom for exiting. made public
* here, could be a property of a class.
public natom

** when creating a name for the atom it has nothing to do with the window name.  
so make the name anything. 
** it is not case senstive abc = ABC

** if the atom exist from previous load it will return a 
** positive number
if GlobalFindAtom('any name') >  0 
   quit 
else
   natom = GlobalAddAtom('any name')  && create atom for the app
endif

* I say use any name, but the name must be consistant.  
* doing a find and add atom will be with the same name.
** at the end of the program just before exiting
** destroy the atom
GlobalDeleteAtom(natom)

* it is importen to destroy the atom, for it is not automaticly destroyed on exit.  
* which will mean that the program will not run again, untill the system is restarted.
использование атома для предотвращения повторного запуска проги (именно на эту тему и выложена инфа, найденная мною) имеет, на мой взгляд, 1 существенный недостаток - критическое падение проги или съем таск_килом - атом тогда не уничтожиццо и повторно запустить прогу можно бует тока после рестарта. А вот мутекс отвалиццо вместе с приложеньцем!
...
Рейтинг: 0 / 0
09.04.2008, 15:33
    #35245710
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Ошибочка вышла - чтобы убить атом, тоже нужен его хэндл!
...
Рейтинг: 0 / 0
09.04.2008, 16:29
    #35245988
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Рано я обрадовался...
Короче не работает атом почему-то. атом не создал, но на любые значения строки GlobalFineAtom мне возвращает одно и то же число 1179648. Т.е. получается что любая строка находится в таблице, раз число не 0...
Сделал вот так:
Код: plaintext
1.
2.
DECLARE integer GlobalAddAtom IN win32api string
DECLARE integer GlobalFindAtom IN win32api string
messagebox(GlobalFindAtom('any string'))
что бы я не написал вместо 'any string' - результат всегда одинаков - 1179648...

че за?
...
Рейтинг: 0 / 0
10.04.2008, 10:06
    #35247199
SoftParanoik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
DECLARE integer GlobalAddAtom IN win32api @ string
DECLARE integer GlobalFindAtom IN win32api @ string
...
Рейтинг: 0 / 0
10.04.2008, 10:18
    #35247237
piva
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Все пашет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Declare integer GlobalAddAtom in win32api string
Declare integer GlobalDeleteAtom in win32api integer
Declare integer GlobalFindAtom in win32api string
c="My TEST"
h=GlobalAddAtom(c)
? h
? GlobalFindAtom(c)
? GlobalDeleteAtom(h)
...
Рейтинг: 0 / 0
10.04.2008, 18:28
    #35249476
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Тут почитай Джефри Рихтера про синхронизацию с помощью объектов ядра Windows. Примеры на Си правда, но там WinAPI восновном.
Объекты могут быть именованные и тогда хэндлы передавать не надо.
...
Рейтинг: 0 / 0
11.04.2008, 00:12
    #35249868
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
SoftParanoikDECLARE integer GlobalAddAtom IN win32api @ string
DECLARE integer GlobalFindAtom IN win32api @ stringтакое не пашет однозначно - при вызове функции грит "Too many parameters". За то если функцию вызвать без параметра, как оно того и требует при таком написании - результат всегда один и это 1179648!

В остальном, что меня повергло в еще большее офигение, проблема осталась. Предыдущие разы я пробовал прогу на ноуте, а там у меня кстати есть одна глюко-фича: в заголовках PageFrames танцы символов. Т.е. к примеру на обычном любом компе заголовок выглядит как "Док.", то у меня на ноуте там почему-то ".Док" и подумал может в ноуте какая-то трабла. Но запустил на писюке - та же картина - 1179648 на любую строку поиска атома. Честно говоря никак не думал что это число будет тем же на разных компах...

Так вот, попробуйте следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Declare integer GlobalAddAtom in win32api string
Declare integer GlobalDeleteAtom in win32api integer
Declare integer GlobalFindAtom in win32api string
lcAtomStr = "My TEST"
lcRandomStr = SYS( 3 )
lnAtomHandle = GlobalAddAtom(m.lcAtomStr)
MESSAGEBOX(GlobalFindAtom(m.lcRandomStr), 0 + 64 ,'GlobalFindAtom('+m.lcRandomStr+')')
MESSAGEBOX(lnAtomHandle, 0 + 64 ,'AtomHandle')
MESSAGEBOX(GlobalFindAtom(m.lcAtomStr), 0 + 64 ,'GlobalFindAtom('+m.lcAtomStr+')')
MESSAGEBOX(GlobalDeleteAtom(m.lnAtomHandle), 0 + 64 ,'GlobalDeleteAtom(AtomHandle)')
у меня первый MESSAGEBOX всегда выдает 1179648, хендл "My TEST" у меня постоянно 1228900, потому как его удаляет нормально и последний MESSAGEBOX выдает 0...
Так вот, я уже написал фунцию опираясь на 1179648 как результат НЕ обнаружения искомой строки - а что делать? У меня лоадер строку пуляет в атом и сам уходит. Запускается основная прога и она ищет атом по строке, а не по хендлу - хендл мне как результат поиска должен выдаццо. Я так понимаю, по прочтении док на МСДН мне должен егор быть (0 или отрицательный результат) при поиске строки, если атом с такой не создан. А вот здесь-то и прокол и хз в чем дело. Я уже и ЕХЕ создавал и отдельно запускал, все равно 1179648 на любую несуществующую строку. Причем удалить атом 1179648 - низзя, егор -65536. По системе это егор №2 - "файл не найден"

У меня уже список вопросов:
- Почему же такое происходит?
- Почему вместо егора 1179648?
- Почему именно 1179648?
- А 1179648 на всех компах будет или только на тех что у меня?

...
...
Рейтинг: 0 / 0
11.04.2008, 15:31
    #35250156
SoftParanoik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Похоже на то, что Фоксяра при вызове этих функций интерпретирует возвращаемое значение как LONG (плевать он хотел на объявление типа INTEGER)!

Придется принудительно сделать обрезание:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
local lhAtom

lhAtom=GlobalAddAtom("My Atom")
lhAtom=mod(lhAtom, 65536 ) & это настоящий код возрата (хэндл)


lhAtom=GlobalFindAtom("My Atom")
lhAtom=mod(lhAtom, 65536 )  & хэндл атома

lhAtom=GlobalFindAtom("qqqqq")
lhAtom=mod(lhAtom, 65536 )  &  = 0  

...
Рейтинг: 0 / 0
11.04.2008, 16:27
    #35250357
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
SoftParanoikПохоже на то, что Фоксяра при вызове этих функций интерпретирует возвращаемое значение как LONG (плевать он хотел на объявление типа INTEGER)! да уж - Ахтунг! Глюки!

т.е. суть в том, что результат атом-функций не должен быть кратным 65536? Или вернее так мы от лонга к интегеру переходим...

А ситуация когда хендл созданного атома окажется кратным 65536 - исключена на 100%?
...
Рейтинг: 0 / 0
11.04.2008, 16:39
    #35250414
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
CTAC-KOА ситуация когда хендл созданного атома окажется кратным 65536 - исключена на 100%?
Да

проверяется на Си элементарно:
Код: plaintext
1.
2.
	ATOM a;
	printf("%d\n", sizeof(a));
Показывает 2, т.е. 2 байта максимум 65535 если без знака
...
Рейтинг: 0 / 0
11.04.2008, 16:53
    #35250487
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Грабли в этом могут быть:
Код: plaintext
lhAtom=mod(lhAtom, 65536 )
но они в другом - фокс считывает 4 байта в LONG, два старших мы откидываем, т.к. туда считался "мусор" из памяти. Но нет гарантии что мусор не даст отрицательное число в итоге, знак - старший разряд, тогда результат обрезания по MOD() будет неправильный. Отрицательные целые в инвертированном виде хранятся в памяти.
...
Рейтинг: 0 / 0
11.04.2008, 16:57
    #35250500
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Спасибо!

ЗЫ. я конечно не си-проггер, но мне кажется (по написанию) функция sizeof возвращает длину чего-то, к примеру строки атома, хендла атома, но не сам хендл атома. Или это мне кажеццо т.к. я не понимаю сути этих 2х строчек кода на сях...
...
Рейтинг: 0 / 0
11.04.2008, 16:59
    #35250507
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
о, так теперь получается что для начала нужно проверить, не отрицательное ли число возвратило, если да, то как-то перевести в положительное, и тогда отрезать 2 старших байта? Причем ABS() тут не поможет...
...
Рейтинг: 0 / 0
11.04.2008, 17:10
    #35250541
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
во, до меня по-немногу начинает доходить. результат атом-функций может быть 0 - егор, и от 1 до 65535 - нормальные значения. т.е. Если результат больше чем 65535 - это нЕбыль. Можно было бы обрабатывать возврат таким образом:
Код: plaintext
1.
2.
local lhAtom
lhAtom=GlobalAddAtom("My Atom")
lhAtom = lhAtom - int(lhAtom/ 65536 )* 65536 
...
Рейтинг: 0 / 0
11.04.2008, 17:17
    #35250573
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
CTAC-KOо, так теперь получается что для начала нужно проверить, не отрицательное ли число возвратило, если да, то как-то перевести в положительное, и тогда отрезать 2 старших байта? Причем ABS() тут не поможет...
Для этого SHORT есть - 16-ти битное целое (т.е. 2 байта)
Declare SHORT GlobalAddAtom in win32api string

Есть правда другие грабли. Прога вылетела, не успела GlobalDeleteAtom вызвать, атом остался. прогу снова запустили. Именованный mutex убъет ОС автоматом.

Если папка расшарена и запустили параллельно с другого компа, то вот вам двойной запуск однопользовательской проги. Ни атом ни mutex не помогут.

Я делаю примерно так в начале
Код: plaintext
1.
2.
3.
if FCREATE([Папка где EXE] + "WORK.FLG") <  0 
   MessageBox("Прога уже запущена")
   quit
endif
Когда прога закроется, файл закроется автоматом. На самом деле я хэндл храню и при нормальном выходе закрываю и удаляю, а при входе если файл WORK.FLG есть и заново создался - значит прошлый выход был аварийный.
...
Рейтинг: 0 / 0
11.04.2008, 17:32
    #35250619
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Dima T
Есть правда другие грабли. Прога вылетела, не успела GlobalDeleteAtom вызвать, атом остался. прогу снова запустили. Именованный mutex убъет ОС автоматом.
я об этом подумал так:
Код: plaintext
1.
DO WHILE GlobalDeleteAtom(GlobalFindAtom(m.lcAtomStr)) =  0 
ENDDO
т.е. пока атом находится - сразу удаляется, а затем создается 1

Dima TЕсли папка расшарена и запустили параллельно с другого компа, то вот вам двойной запуск однопользовательской проги. Ни атом ни mutex не помогут.
Повторный запуск проги на 1м компе по-другому ловлю - как на фоксклубе, т.е. через семафор. Запуск из расшарок - не канает. Ведь и суть "запускальщика" - залить на комп клиента новую версию проги, если там, хде она обычно лежит она новее, чем у юзера в данный момент и потом запустить. И еще - не дать юзерам напрямую запускать устаревшего клиента.
...
Рейтинг: 0 / 0
15.04.2008, 15:58
    #35256643
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
Dima TДля этого SHORT есть - 16-ти битное целое (т.е. 2 байта)
Declare SHORT GlobalAddAtom in win32api string попробовал, теперь отрицательные числа выдает, но, правда, работает. У меня теперь хэндл атома получается -16351, ответ на удаление 0, ответ на поиск случайной строки 0. Попробовал закрыть хэндл в MOD(h,65536) - тоже работает ок, и тогда хэндл получается положительным числом 49185. Вот ведь интересно-то как получается, апям что 49185, что -16351 - все равно...

даже и не знаю - есть ли смысл тогда в MODе? :)
...
Рейтинг: 0 / 0
15.04.2008, 16:36
    #35256767
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
CTAC-KO Dima TДля этого SHORT есть - 16-ти битное целое (т.е. 2 байта)
Declare SHORT GlobalAddAtom in win32api string попробовал, теперь отрицательные числа выдает, но, правда, работает.
Не обращай внимание. Все правильно, просто возвращается число без знака больше 32768. Если читать его как со знаком (что SHORT делает), то оно будет отрицательным. На работу это никак не повлияет, т.к. обратно в память при вызове GlobalDeleteAtom() оно запишется как надо.

т.е. SHORT от -32768 до 32767. а хэндл от 0 до 65535.

CTAC-KOдаже и не знаю - есть ли смысл тогда в MODе? :)
MOD не надо. Никаких преобразований хэндла. Поставил везде SHORT вместо INTEGER и все. т.е. тип ATOM должен подменяться на тип SHORT в фоксе.
...
Рейтинг: 0 / 0
15.04.2008, 16:59
    #35256839
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
CTAC-KOинтересно-то как получается, апям что 49185, что -16351 - все равно...
Дык это одно и то-же число :)
Если два байта интерпретировать как беззнаковое, то 49185, если как знаковое, то -16351, но набор битов то одинаковый :)
...
Рейтинг: 0 / 0
21.04.2008, 10:02
    #35267664
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с WinAPI semaphore или подобное
спасибо, я догадывался о чем-то таком - что это может быть одно и то же число, только не знал почему.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с WinAPI semaphore или подобное / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]