Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Как с помощью SendMessage (PostMessage) послать char или CString ???  (Прочитано 47723 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 30-03-2005 08:05 » 

Люди, у меня уже полный тормоз - как это сделать?  :?
В обычном случае, когда все сообщения посылаются в рамках одного приложения, это не проблема - передаем адрес переменной, в которой хранится текст, а при получении сообщения считываем значение из этой переменной. А тут? Тут же разные адресные пространства, т.е. этот метод не пройдет.   Здесь была моя ладья...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
xelos
Гость
« Ответ #1 : 30-03-2005 08:55 » 

для передачи больших объемов данных сообщения виндоуз не особо подходят. стоит пользовать другие механизмы межпроцессных взаимодейтсвий (IPC) - типа pipes, memory mapped files...
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 30-03-2005 10:18 » 

xelos,

так вот этого-то и не хотелось Ага Хотелось облегчить себе жизнь Ага Но похоже, что не выйдет...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 30-03-2005 12:28 » 

Передавай "указатель" в shared memory

первый параметр сообщения -- идентификатор области разделяемой памяти (приложения должны договориться, как идентификатор соответствует имени Memory-mapped объекта), второй параметр -- отступ от начала общей памяти.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 30-03-2005 14:58 » 

npak,

спасибочки, все ясно. Мне просто так не хотелось со всем этим возиться ;-( Но придется...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 30-03-2005 19:29 » 

Если строки маленькие. То можно передавать через атомы. Посмотри такие функции
AddAtom
DeleteAtom
FindAtom
GetAtomName
GlobalAddAtom
GlobalDeleteAtom
GlobalFindAtom
GlobalGetAtomName
InitAtomTable
Если используеш глобальный атом. То схема такая. В атом загоняеш (GlobalAddAtom) свою строку. Через SendMessage передаеш номер атома. То приложение которое принимает, просто считывает атом по номеру (GlobalGetAtomName).

Цитата
The GlobalAddAtom function adds a character string to the global atom table and returns a unique value (an atom) identifying the string.

ATOM GlobalAddAtom(

    LPCTSTR lpString    // pointer to the string to add
   );   
 

Parameters

lpString

Points to the null-terminated string to be added. The string can have a maximum size of 255 bytes. Strings that differ only in case are considered identical. The case of the first string of this name added to the table is preserved and returned by the GlobalGetAtomName function.

 

Return Values

If the function succeeds, the return value is the newly created atom.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

If the string already exists in the global atom table, the atom for the existing string is returned and the atom's reference count is incremented.
The string associated with the atom is not deleted from memory until its reference count is zero. For more information, see the GlobalDeleteAtom function.
Global atoms are not deleted automatically when the application terminates. For every call to the GlobalAddAtom function, there must be a corresponding call to the GlobalDeleteAtom function.

GlobalAddAtom returns a string atom whose value is in the range 0xC000 through 0xFFFF.
If the lpString parameter has the form "#1234", GlobalAddAtom returns an integer atom whose value is the 16-bit representation of the decimal number specified in the string (0x04D2, in this example). If the decimal value specified is 0x0000 or a value in the range 0xC000 through 0xFFFF, the return value is zero, indicating an error. If lpString is in the range 0x0001 through 0xBFFF, the return value is the low-order word of lpString.

The MAKEINTATOM macro can be used to convert a WORD value into a string that can be added to the atom table by using the GlobalAddAtom function.
Цитата
The GlobalGetAtomName function retrieves a copy of the character string associated with the specified global atom.

UINT GlobalGetAtomName(

    ATOM nAtom,   // atom identifier
    LPTSTR lpBuffer,   // pointer to the buffer for the atom string 
    int nSize    // size of the buffer
   );   
 

Parameters

nAtom

Identifies the global atom associated with the character string to be retrieved.

lpBuffer

Points to the buffer for the character string.

nSize

Specifies the size, in characters, of the buffer.

 

Return Values

If the function succeeds, the return value is the length of the string copied to the buffer, in characters, not including the terminating null character.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

The string returned for an integer atom (an atom created by the MAKEINTATOM macro) is a null-terminated string in which the first character is a pound sign (#) and the remaining characters represent the unsigned integer originally passed to MAKEINTATOM
.

Офф топ: Кстати сейчас заметил. Это мое сообшение имеет код 404. Ошибочка вышла Улыбаюсь
« Последнее редактирование: 30-03-2005 19:53 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 31-03-2005 07:39 » 

Finch,

спасибочки! Работает! И даже невзирая на ошибку 404 Ага Слава богу, что не надо весь этот огород с shared memory городить, если речь идет о маленьком стринге.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 31-03-2005 12:44 » 

Да кстати не забудь уничтожать атомы по мере ненадобности. Через GlobalDeleteAtom.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 31-03-2005 14:10 » 

Finch,

ой, конечно на радостях, что заработало и так просто, я об этом даже подумать забыла.  Вот такой я вот Спасибо!  Пора или на пенсию или в отпуск! Отлично
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Melquiades
Гость
« Ответ #9 : 01-04-2005 12:11 » 

Почему-то никто не вспомнил о WM_COPYDATA.
А это, наверное, самый простой способ
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 01-04-2005 12:35 » 

Melquiades,
 
спасибо за идею, надо будет попробовать!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
egor1488
Гость
« Ответ #11 : 04-04-2005 04:09 » 

Ребята, вопрос в ту же тему! У меня при создании динамического массива (char *mas=new char[size]), создается массив на четыре элемента больше чем size. Чего такое? Пишу на VS 6.0.
Записан
Tумблер
Гость
« Ответ #12 : 05-04-2005 13:24 » 

массива (char *mas=new char[size]), создается массив на четыре элемента больше .
А каким способом это удалось установить ?
Вообще, Виндус  может выделять память 4K -ными отрезками, он просто так устроен. Это значит, что при char *mas=new char[2]; все равно будет выдано 4 К..
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 05-04-2005 14:51 » 

Tумблер, Если бы при каждом new Виндовс бы выделял страницу по 4 килобайта. То бы программы довольно бы часто вылетали из-за нехватки памяти. Сделано проше. Выделяется куча (Heap). И уже в этой куче выделяется память для функции new.
egor1488 IMHO char *mas является ссылкой на массив символов. Для 32 разрядных систем имеет размер 4 байта. Плюс под массив ты выделяеш память с размером size байт. Возможно еше добавление до трех байт для выравнивания.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Tумблер
Гость
« Ответ #14 : 07-04-2005 09:20 » new

Tумблер, Сделано проше. Выделяется куча (Heap). И уже в этой куче выделяется память для функции new.

 Хотелось бы в это верить, но "увы".
Допустим, выделяется ХИП. И что же ?
Смысл new-delete в динамическом создании-уничтожении обьектов.
В произвольном порядке.
Но при этом память быстро становится фрагментированной.
Если бы не : программно-аппаратный алгоритм управления памятью Виндус !
Который принципиально работает с блоками по 4 К. И принципиально
обеспечивает отсутствие фрагментации.
 Иначе (например под DOS) невозможно обеспечить полноценную
работу создания-уничтожения обьектов в общем виде.
 Возможно, ХИП запрашивается и выделяется с целью упростить
для Виндус своппирование памяти на диск. А возможно, это рудимент из прошлого..

 В любом случае, char *p=new char[2] я бы не рекомендовал.
Или поместить такой обьект в стек. (при достаточном  размере стека).
Или подсчитать общую память для таких обьектов, взять достаточный кусок
для них, а внутри - распределить вручную.
 Улыбаюсь
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #15 : 07-04-2005 09:51 » 

А может дело в округлении размера типов данных. Если стоит округление "до 8 байт", то при выделении 1 байта - будет выделятся 8, столько же при выделении 8 байт.
« Последнее редактирование: 07-04-2005 10:06 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Alf
Гость
« Ответ #16 : 07-04-2005 10:02 » 

Хотелось бы в это верить, но "увы".
Допустим, выделяется ХИП. И что же ?
Смысл new-delete в динамическом создании-уничтожении обьектов.
В произвольном порядке.
Но при этом память быстро становится фрагментированной.
Если бы не : программно-аппаратный алгоритм управления памятью Виндус !
Который принципиально работает с блоками по 4 К. И принципиально
обеспечивает отсутствие фрагментации.
 Иначе (например под DOS) невозможно обеспечить полноценную
работу создания-уничтожения обьектов в общем виде.
 Возможно, ХИП запрашивается и выделяется с целью упростить
для Виндус своппирование памяти на диск. А возможно, это рудимент из прошлого..

 В любом случае, char *p=new char[2] я бы не рекомендовал.
Или поместить такой обьект в стек. (при достаточном  размере стека).
Или подсчитать общую память для таких обьектов, взять достаточный кусок
для них, а внутри - распределить вручную.
 Улыбаюсь

Я не понял,у нас что, 1 апреля на форуме еще не закончилось? Или юмор теперь в этой теме публиковаться будет?  :?
Записан
Tумблер
Гость
« Ответ #17 : 07-04-2005 10:13 » 

Или юмор теперь в этой теме публиковаться будет? :?
Незнаю, как там насчет праздников вообще, но у Вас это сообщение - явно
юбилейное !!! (800).
С чем Вас и поздравляю !!!
  Ха-ха-ха
Записан
Alf
Гость
« Ответ #18 : 07-04-2005 10:19 » 

Оно-то, конечно, спасибо на добром слове...

Однако откуда источники сведений насчет особенностей распределения памяти именно в Windows и принципиальной невозможности того же в среде DOS? Или об участии "кучи" в процессе своппинга? Про стек для размещения динамических объектов или ручном управлении памятью вообще не говорю. Это личное творчество или откуда-то заимствовано?

Сюда ведь зачастую новички заходят в поисках ответов на свои вопросы, и они все, что сказано с серьезным видом, принимают за чистую монету. Не нужно сбивать с толку людей, которым и так трудно разобраться.
Записан
Tумблер
Гость
« Ответ #19 : 07-04-2005 10:46 » 

Однако откуда источники сведений насчет особенностей распределения памяти именно в Windows и принципиальной невозможности того же в среде DOS?

 А разве это не так ?
"ДА"- я не могу математически точно доказать, что DOS-память
(как кстати и память HD) обязательно будет фрагментирована при
произвольном займе-возврате.
Но поверьте , это - действительно так.

Для решения этого вопроса и был создан механизм виртуальной памяти.
Который использует Виндус. Конечно, физически память всегда будет
фрагментирована. Но виртуальная (с ней и работают приложения)
не фрагментирована никогда.
 И за этот комфорт Виндус (и мы вместе с ним) жестоко платит.
Поскольку каждое обрашение к памяти приводит к нескольким
обращениям к ней же + вычисления.
Это особенно, кстати, было заметно в эпоху 486DX4-66-100.
Под DOS все "летает", а под Вин еле ворочается.
 Отлично
Записан
Alf
Гость
« Ответ #20 : 07-04-2005 11:25 » 

А разве это не так ?
"ДА"- я не могу математически точно доказать, что DOS-память
(как кстати и память HD) обязательно будет фрагментирована при
произвольном займе-возврате.
Но поверьте , это - действительно так.

Убедительно, однако... Напоминает известный анеекдот.

В грузинской школе урок геометрии. Учитель:
- Гоги,выйди к доске и начерти равнобедренный треугольник.
Гоги вышел, начертил.
- Гоги, докажи что он равнобедренный.
- Мамой клянусь!
 Улыбаюсь

Для решения этого вопроса и был создан механизм виртуальной памяти.
Который использует Виндус. Конечно, физически память всегда будет
фрагментирована. Но виртуальная (с ней и работают приложения)
не фрагментирована никогда.

Похоже, тут в какой-от винегрет замешаны распределение динамической памяти в приложении, которым занимается исполняющая система C++, и страничный механизм отображения виртуальной памяти на физическую, который к этому ни малейшего отношения не имеет.

Кстати, механизм виртуальной памяти разрабатывался уж никак не для устранения фрагментации "кучи". Это весьма эффективное решение для одновременного выполнения многих процессов на одном компьютере, когда каждый выполняется в изолированном виртуальном адресном пространстве. Однако этому решению лет этак 40, если не больше. Windows немного моложе будет.

И за этот комфорт Виндус (и мы вместе с ним) жестоко платит.
Поскольку каждое обрашение к памяти приводит к нескольким
обращениям к ней же + вычисления.

Пардон, а другим операционным системам виртуальная память неведома? UNIX, OS/2 и прочие освобождены от этого непосильного бремени?

Под DOS все "летает", а под Вин еле ворочается.
 Отлично

И что там именно все "летает" под DOS? Norton Commander? DOOM? Или еще какая-то суперзадача, которую современные компы с гигагерцовыми частотами не в силах переварить?
Записан
Tумблер
Гость
« Ответ #21 : 08-04-2005 10:07 » 

Убедительно, однако... Напоминает известный анеекдот.

 Действительно - у вас клуб весельчаков. Улыбаюсь
Но штоб носить гордый шеврон "У" этого мало...
Жаль
Записан
Alf
Гость
« Ответ #22 : 08-04-2005 11:19 » 

Ничего, теперь этот шеврон есть кому нести с гордостью. Еще несколько перлов по поводу "свопа через хип" или НИКОГДА не фрагментируемой виртуальной памяти, и аудиторию у "Аншлага" мы точно отобьем. От одной сентенции про прогрессивный DOS Петросян от зависти позеленеет.

Ладно, давай в тему. Человек задает вопрос, и его интересует достоверная, практически полезная информация, а не домыслы вокруг виртуальной памяти, не имеющие ничего общего с реальностью.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 09-04-2005 11:09 » 

(кстати - давно забыли про эмблему сайта! Извиняюсь за перебил  Улыбаюсь )
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #24 : 29-04-2005 09:29 » 

Люди,
пару слов по поводу WM_COPYDATA - если кто-то будет использовать:
это очень хорошо только в случае применения конкретного хендла окна
(т.е. hwndWnd = ::FindWindow(NULL, "window_name")). Но во-первых, это имя не всегда известно заранее, а во-вторых - жесткое кодирование вещь не всегда удобная...
Если же вместо хендла использовать HWND_BROADCAST, то возникают проблемы в связи с тем, что и другие приложения имеют в своем коде реакцию на это сообщение, например, outlook.
А это означает непредсказуемость поведения своего приложения и конфликты с другими...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Александр Цикин
Гость
« Ответ #25 : 29-04-2005 14:14 » 

Может быть так, если все уже в дебри полезли Отлично
Каждое окно в Windows имеет свой уникальный идентификатор.
Если надо динамически, то сначала получаем его, а потом уже CopyData, и ссылку получить можно, если хочется,
правда, я это никогда не пробовал, но по идее-то должно работать Улыбаюсь
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #26 : 02-05-2005 10:27 » 

в том-то и дело - для этого надо что-то жестко запрограммировать (например, имя окна). А это уже ухудшает качество программы, т.е. делает ее более зависимой от каких-то внешних параметров.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Александр Цикин
Гость
« Ответ #27 : 02-05-2005 20:17 » 

Оно все равно - что-то программировать надо жестко, как не имя окна, например? (и почему это после этого от каких-то внешних факторов зависить будет?) Объяви локально, а потом, кто мешает и имя назначить динамически.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #28 : 03-05-2005 07:57 » 

Malaja, чёт я не пойму в чём проблема? Если ты хчешь с какм-то конкретным окном работать, то тебе надо его каким-то образом "оконкретизовать" - через имя окна, через присвоенный ему хэндл (но этот хендл тоже надо откуда-то брать, например окно само сообщает свой хэндл), через координаты (как это например делает Spy).
Если же ты хочешь обойтись без этого, то тогда тебе надо посылать индивидуальное соообщение, которое будет распознано обработчиком только твоей проги. Например сгенерить GUID и передавать его в качестве параметра. Все остальные действия только при опознании этого GUID.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #29 : 03-05-2005 08:02 » 

Саш,
 
Почему? Если я делаю все через HWND_BROADCAST, меня вообще ничего не интересует, т.е. я знать ничего  не знаю о программе - приемнике! И если она изменится, посылающую сообщение программу это не затрагивает! Итого - полная автономия! Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines