![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Micher |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.1.2006 Где: г. Ижевск Репутация: нет Всего: нет |
День добрый. У меня такая ситуация. Есть 2 приложения, написанные НЕ на делфи, но они импортируют DLL на делфи. Приложения получают данные через интернет. Первое приложение, получив определённую информацию, должна послать данные 2-му приложению(например какую-то строку). Написал в DLL такую функцию для отправки сообщения посредством SendMessage:
Теперь, не могу понять, как принять те данные(в частности строку) вторым приложением? Нужна функция, которая бы возвращала именно эти данные. Нашёл в инете примерно такой код:
Помогите написать функцию для DLL, в делфи очень слабо разбираюсь, к сожалению |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
нужно имено через сендмессаге?
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 10 Всего: 133 |
Micher, сообщения посылаются окнам! Самой программе ничего не посылается, если у нее нет окна. Поэтому, если хочешь передавать текст от одной библиотеки другой, то сообщения использовать не получится, т.к. в библиотеках нет окон (конечно, можно запихнуть, но зачем?). Пробуй другие варианты. Мьютексы или симафоры.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Micher |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.1.2006 Где: г. Ижевск Репутация: нет Всего: нет |
Рассмотрю другие варианты Добавлено @ 17:06
Вы недопоняли. Есть 2 приложения(которые работают в отдельных окнах), оба они написаны не на делфи, но оба подключают одну и ту же DLL, написанную на делфи как раз. 1 приложение, получив данные извне, должно как то сообщить что-либо второму приложению - например, послать ту же строку, ну или набор чисел. Т.е. нужно написать в этой DLL грубо говоря 2 функции: 1) функция типа sendData() - отправить данные 2) функция типа receivedata() - получить данные 1 приложение вызывает sendData() , а второе как то должно принять, то что посылает ему первое. И обе функции будут в DLL Это сообщение отредактировал(а) Micher - 7.10.2008, 17:09 |
||||
|
|||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Micher, по сабжу. что мешает из dll узнать хендл принимающего сообщения окна, и подменить ему с помощью SetWindowLong процедуру обработки сообщений?
п.с. завтра накидаю примерчик, сейчас нет ни возможности, ни мозгов, ни желания :( -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Micher |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.1.2006 Где: г. Ижевск Репутация: нет Всего: нет |
Можно отсюда поподробнее? |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
имхо можно юзать filemapping , udp, pipe .... можно заюзать атомы ,
для твоих уелей наверное первое самое оптимальное -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Micher |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.1.2006 Где: г. Ижевск Репутация: нет Всего: нет |
Нашёл в инете пример по работе с FileMapping:
Вопросов возникло немало: а как из другого приложения читать то, что пишет первая. Нужно ли, чтобы обе программы работали одновременно ? У меня планируется, что 2 приложения будут работать в течение долгого времени - несколько часов(в бесконечных циклах). Т.е. они оба будут работать беспрерывно. Но как всё таки читать вторым приложением то что пишет первое, не понимаю. Как получить доступ к той области, куда пишет первое.... по идентификатору какому-то(заранее оговоренному?) ? Было бы здорово получить пример |
||||
|
|||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
да, это у тебя 'MySharedValue'
создаешь файлмаппинг с одинаковым именем в обеих программах и на практике первая программа его создаст, а вторая только откроет. MapViewOfFile в разных процессах вернет (в общем случае) разное значение, но обе области гарантировано имеют одинаковое содержимое в обоих процессах. В одном пишешь в область, начинающуюся с lpBaseAddress, в другом читаешь. Только наверное нужно еще как-то передавать сигнал о том что данные записаны и пора перечитать. Для этой цели можно использовать эвент или мютекс. -------------------- Обижено школьников: 8 |
|||
|
||||
| Micher |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.1.2006 Где: г. Ижевск Репутация: нет Всего: нет |
Спасибо за ответ! Сигнал подавать не придётся, так как оба приложения фактически в бесконечных циклах будут читать/писать в маппинг. А вопрос, если первое приложение(которое создало маппинг) завершит свою работу, то маппинг будет ещё доступен второму приложению или память под маппинг очистится? |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
тут ты получаеш хэндл. Если этот код вызывается из двух процессов то имеем уже два хэндла тут создается неявный хэндл (еще один) на тот же файлмаппинг. Неявный потому что lpBaseAddress это не хэндл, а указатель. Неявный хэндл закрывается при вызове UnmapViewOfFile. Это тоже выполняется в двух процессах, итого имеем 4 хэндла на один объект. Если ты закроешь в одном процессе все его хэндлы на объект (две штуки) или тупо крашнеш программу (при этом винда сама закроет все хэндлы принадлежащие умирающему процессу) то останется еще два хэндла на объект (принадлежащие другому процессу) и объект будет благополучно существовать, пока счётчик хэндлов не станет 0 -------------------- Обижено школьников: 8 |
||||
|
|||||
| Micher |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.1.2006 Где: г. Ижевск Репутация: нет Всего: нет |
Стыдно спросить, но что есть мютекс? И как использовать его чтобы предотвратить одновременную запись и чтение? |
|||
|
||||
| bems |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Еще до любой записи или чтения (там же где ты вызывашь CreateFileMapping) нужно сделать
а чтение и запись так:
кстати имена своих файлмаппинга и мютекса сделай какими-то сильно длинными и уникальными, чтобы случайно не пересечся с чьей-то чужой прогой -------------------- Обижено школьников: 8 |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |