|
|
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Привет! Както заинтересовался такой темой - программу запускает загрузчик, который предварительно проверяет нет ли новой версии, затем обновляет если надо, затем запускает прогу. Это я нашел как сделать на фоксклубе. Но теперь у меня возникла другая необходимость - хочу чтоб напрямую, мимо лоадера прога не запускалась. Сначала я просто придумал передавать спец. параметр в командную строку при запуске, но сразу так думал и сейчас хочется - создавать некий флажок в виндах. К примеру лоадер его создает, а прога при запуске проверяет есть ли оный, если нет - не запускаеццо, если есть - запускаеццо и убирает его. Таким флажком мог бы выступить semaphore, но как с ним работать - я не понял. На примере "как не дать прогу запустить дважды" я вижу как он создается, но при выходе из проги - он автоматом уничтожаеццо, наверное по принципу parent/child. Значит из лоадера вышли (он делает RUN /n и отваливаеццо) - флажка не стало - так не пойдет. Может кто подсказать как решить такую задачу? спасибо вфп9 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2008, 00:31 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2008, 09:12 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Старые добрые глобальные атомы (GlobalAddAtom, GlobalFindAtom и т.п.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2008, 12:00 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
спасибо. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2008, 15:06 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Ошибочка вышла - чтобы убить атом, тоже нужен его хэндл! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2008, 15:33 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Рано я обрадовался... Короче не работает атом почему-то. атом не создал, но на любые значения строки GlobalFineAtom мне возвращает одно и то же число 1179648. Т.е. получается что любая строка находится в таблице, раз число не 0... Сделал вот так: Код: plaintext 1. 2. че за? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2008, 16:29 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
DECLARE integer GlobalAddAtom IN win32api @ string DECLARE integer GlobalFindAtom IN win32api @ string ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 10:06 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Все пашет Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 10:18 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Тут почитай Джефри Рихтера про синхронизацию с помощью объектов ядра Windows. Примеры на Си правда, но там WinAPI восновном. Объекты могут быть именованные и тогда хэндлы передавать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2008, 18:28 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
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. Так вот, я уже написал фунцию опираясь на 1179648 как результат НЕ обнаружения искомой строки - а что делать? У меня лоадер строку пуляет в атом и сам уходит. Запускается основная прога и она ищет атом по строке, а не по хендлу - хендл мне как результат поиска должен выдаццо. Я так понимаю, по прочтении док на МСДН мне должен егор быть (0 или отрицательный результат) при поиске строки, если атом с такой не создан. А вот здесь-то и прокол и хз в чем дело. Я уже и ЕХЕ создавал и отдельно запускал, все равно 1179648 на любую несуществующую строку. Причем удалить атом 1179648 - низзя, егор -65536. По системе это егор №2 - "файл не найден" У меня уже список вопросов: - Почему же такое происходит? - Почему вместо егора 1179648? - Почему именно 1179648? - А 1179648 на всех компах будет или только на тех что у меня? ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 00:12 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Похоже на то, что Фоксяра при вызове этих функций интерпретирует возвращаемое значение как LONG (плевать он хотел на объявление типа INTEGER)! Придется принудительно сделать обрезание: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 15:31 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
SoftParanoikПохоже на то, что Фоксяра при вызове этих функций интерпретирует возвращаемое значение как LONG (плевать он хотел на объявление типа INTEGER)! да уж - Ахтунг! Глюки! т.е. суть в том, что результат атом-функций не должен быть кратным 65536? Или вернее так мы от лонга к интегеру переходим... А ситуация когда хендл созданного атома окажется кратным 65536 - исключена на 100%? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 16:27 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
CTAC-KOА ситуация когда хендл созданного атома окажется кратным 65536 - исключена на 100%? Да проверяется на Си элементарно: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 16:39 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Грабли в этом могут быть: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 16:53 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Спасибо! ЗЫ. я конечно не си-проггер, но мне кажется (по написанию) функция sizeof возвращает длину чего-то, к примеру строки атома, хендла атома, но не сам хендл атома. Или это мне кажеццо т.к. я не понимаю сути этих 2х строчек кода на сях... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 16:57 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
о, так теперь получается что для начала нужно проверить, не отрицательное ли число возвратило, если да, то как-то перевести в положительное, и тогда отрезать 2 старших байта? Причем ABS() тут не поможет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 16:59 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
во, до меня по-немногу начинает доходить. результат атом-функций может быть 0 - егор, и от 1 до 65535 - нормальные значения. т.е. Если результат больше чем 65535 - это нЕбыль. Можно было бы обрабатывать возврат таким образом: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 17:10 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
CTAC-KOо, так теперь получается что для начала нужно проверить, не отрицательное ли число возвратило, если да, то как-то перевести в положительное, и тогда отрезать 2 старших байта? Причем ABS() тут не поможет... Для этого SHORT есть - 16-ти битное целое (т.е. 2 байта) Declare SHORT GlobalAddAtom in win32api string Есть правда другие грабли. Прога вылетела, не успела GlobalDeleteAtom вызвать, атом остался. прогу снова запустили. Именованный mutex убъет ОС автоматом. Если папка расшарена и запустили параллельно с другого компа, то вот вам двойной запуск однопользовательской проги. Ни атом ни mutex не помогут. Я делаю примерно так в начале Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 17:17 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Dima T Есть правда другие грабли. Прога вылетела, не успела GlobalDeleteAtom вызвать, атом остался. прогу снова запустили. Именованный mutex убъет ОС автоматом. я об этом подумал так: Код: plaintext 1. Dima TЕсли папка расшарена и запустили параллельно с другого компа, то вот вам двойной запуск однопользовательской проги. Ни атом ни mutex не помогут. Повторный запуск проги на 1м компе по-другому ловлю - как на фоксклубе, т.е. через семафор. Запуск из расшарок - не канает. Ведь и суть "запускальщика" - залить на комп клиента новую версию проги, если там, хде она обычно лежит она новее, чем у юзера в данный момент и потом запустить. И еще - не дать юзерам напрямую запускать устаревшего клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2008, 17:32 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
Dima TДля этого SHORT есть - 16-ти битное целое (т.е. 2 байта) Declare SHORT GlobalAddAtom in win32api string попробовал, теперь отрицательные числа выдает, но, правда, работает. У меня теперь хэндл атома получается -16351, ответ на удаление 0, ответ на поиск случайной строки 0. Попробовал закрыть хэндл в MOD(h,65536) - тоже работает ок, и тогда хэндл получается положительным числом 49185. Вот ведь интересно-то как получается, апям что 49185, что -16351 - все равно... даже и не знаю - есть ли смысл тогда в MODе? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 15:58 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
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 в фоксе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 16:36 |
|
||
|
Помогите с WinAPI semaphore или подобное
|
|||
|---|---|---|---|
|
#18+
CTAC-KOинтересно-то как получается, апям что 49185, что -16351 - все равно... Дык это одно и то-же число :) Если два байта интерпретировать как беззнаковое, то 49185, если как знаковое, то -16351, но набор битов то одинаковый :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 16:59 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35244108&tid=1587858]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 399ms |

| 0 / 0 |
