Что такое атомы и с чем их едят?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Что такое атомы и с чем их едят?

Сообщение arthur2 » 04.04.2008 (Пт) 11:33

В соседнем топике был такой разговор (к сожалению, тема в этом русле развиваться не стала, так что пытаюсь перенести разговор сюда):

Хакер
Атом - это особое 16-битное число, соответсвующее строке в особой таблице. Строка при этом может быть не длиннее 255 символов.

Атомы глобальны для рабочей станции. Их можно добавлять/удалять, искать атом по его имени (строке, ассоциированной с атомом).
_________________


На что у меня возникли вопросы:

То есть, зная строку, я могу посмотреть значение, или наоборот, зная значение, строку? И то и другое я сам задаю? Строка в особой таблице и имя атома - одно и то же?

Правильно ли я понял:
1. Создаю атом с именем "вася", кладу в него значение 10, запускаю другую программу.

2. Программа смотрит на атом и именем "вася", умножает его значение на 100, пишет результат в этот же атом.

3. Я дожидаюсь, пока она подаст мне какой-то знак, что, мол, готово, и забираю из "вася" результат.

Если правильно, то как всё это осуществить. Если неправильно, то как осуществить вместо всего этого то, что правильно :lol:

Можно ли атомами передавать небольшие строки? числа? какие-то ссылки на большие строки?

В общем, как всё это работает. Желательно чуть больше конкретики. Хорошо бы какой-нибудь пример.
Артур
 
   

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 04.04.2008 (Пт) 11:50

Interprocess communication в поиск или в MSDN

советую: http://www.codeproject.com/KB/vbscript/vb6ipc.aspx

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 04.04.2008 (Пт) 14:43

Атомы это неизменяемые объекты.
Чувак юзай и правда tmp-файлы для обмена и не мучайся
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 04.04.2008 (Пт) 20:24

Konst_One
Спасибо! По ссылке пытаюсь разобраться. Э-эх, по-русски бы чё-нить... :)

По Interprocess communication поиск выдаёт в основном ссылки на линукс и на какой-то один и тот же реферат, в котором упор на си.


ANDLL
Спасибо за подробный, внятный и исчерпывающий ответ. :D
Вполне осознал всю свою непроходимую природную тупость. Робею пред лучезарными высотами непостежимой програмёрской мудрости и больше не рыпаюь. Прости, что наследил тут. :oops:
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 19:39

Как конченый ламер и тупой непрограмист, в который раз отвечаю себе сам (гуру, как обычно, не снизошли).

Функции для атомов: AddAtom FindAtom GetAtomName DeleteAtom для локальных атомов. И всё то же самое (GlobalAddAtom и т.д) для глобальных.

Создавать, искать и удалять атомы крайне просто, а куда их применить - совершенно непонятно.

Атом - это уникальная неделимая связка короткой строки и её номера. Номер присваивается атому системой. При создаче атома с уже существующим именем просто возвращается тот же номер. То есть связка строка - номер получается уникальной.

Использовать атомы для общения программ, кажется, не реально. Суть с в следующем: создаю атом "вася" - ему присваивается номер. Теперь я знаю, под каким вася номером. А толку? Другая программа, зная имя вася, тоже может узнать этот номер, но он ни о чём не говорит, ведь его нельзя задать самостоятельно. Можно было бы передать саму строку-имя, но для этого нужно передать сначала номер. Замкнутый круг.

Куда плодотворней оказалась идея, предложенная Konst_One (см. ссылку в его топике).

Суть в следующем: Я создаю самое простенькое из возможных окно:

hwndThis = CreateWindowEx(0, "STATIC", "суперпуперзаголовок", 0, 0, 0, 0, 0, 0, 0, App.hInstance, ByVal 0&)

и ставлю на него субклассинг.

Затем регистрирую в системе собственное сообщение.

msg = RegisterWindowMessage("моё_собственное_суперское_сообщение")

Всё, ждём-с...

Программа, которая хотит со мной пообщаться:
1. Регистрирует в системе то же самое сообщение (так как оно уже мной зарегистрировано, программа просто получит его номер)
2. По суперпуперзаголовку ищет моё самодельное окно.
3. Отправляет ему это сообщение

Call SendMessageLong(hwndTarget, msg, нужноечисло,ещёоднонужноечисло)

, а в wParam и lParam передаёт мне всё, что заблагорассудится. В том числе, кстати, и номер атома - чтобы с ним передать, например, строку.

Вуаля! Проблемма решена!

Спасибо Konst_One за отличную ссылку.
Артур
 
   

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 05.04.2008 (Сб) 20:08

А можно, вообще, сделать так, чтобы один процесс "передал" память (динамически выделенную) другому? Например вот, копирование в буфер обмена осуществляется таким образом: процесс выделяет память при помощи GlobalAlloc, кладёт туда нужную инфу и вызывает SetClipboardData. После этого память переходит в собственность системы (правда, процессу разрешается оттуда читать).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 20:12

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 05.04.2008 (Сб) 20:38

Хакер
Ну это как-то неправильно. Всё-таки, информация пишется в файл. А если негде создавать файл?.. Вот так чтоб один процесс передал память другому, ну или хотя бы зашейрил? Кстати, вот ещё придумал: приложению передаётся командная строка. Но и она, и буфер обмена - обмен памятью с системой. Может быть, обмениваться памятью можно только с системой?
Последний раз редактировалось Александр Дмитриев 05.04.2008 (Сб) 20:46, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 20:43

ХакерНу это как-то неправильно. Всё-таки, информация пишется в файл.

Так работает память в Windows. Информация пишется в файл. Файл подкачки.

А если негде создавать файл?.. Вот так чтоб один процесс передал память другому, ну или хотя бы зашейрил?

Кто сказал, что надо обязательно создавать какой-то файл?
Если передать -1 вместо хэндла файла в функцию CreateFileMapping, будет использоваться место в файле подкачки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 05.04.2008 (Сб) 21:08

Хакер
Всё в порядке. Я понял.
arthur2
Тогда может, тебе это и использовать вместо атомов? (Если уж не хочешь через DLL).

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 06.04.2008 (Вс) 0:02

Александр Дмитриев
это - в смысле CreateFileMapping или в смысле сообщения?

Если первое, то я ещё его не до конца понял. Там ведь ещё нужно, чтобы программа как-то дала понять, что она уже ответила.

А если сообщения - то да, попытаюсь.

От длл я до конца тоже ещё не отказался.
Артур
 
   

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 06.04.2008 (Вс) 1:25

arthur2 писал(а):это - в смысле CreateFileMapping или в смысле сообщения?
При использовании маппинга использовать CreateFileMapping придётся в любом случае. Делаешь так: запускаешь CreateFileMapping (указываешь там первый параметр -1, последний - имя создаваемого map), далее MapViewOfFile, пишешь входные данные, UnmapViewOfFile, запускаешь прогу (она делает OpenFileMapping c последним параметром - именем map, MapViewOfFile, пишет выходные данные, UnmapViewOfFile), дожидаешься завершения проги, MapViewOfFile, читаешь выходные данные, UnmapViewOfFile.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 06.04.2008 (Вс) 7:33

Александр Дмитриев

Спасибо! да, теперь понятно!
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

    TopList