Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прямой доступ в память 
:(
    Опции темы
Micher
  Дата 5.10.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



Привет всем! Такой вопрос:
Можно ли в делфи - работать с памятью на прямую? Мне нужно написать DLL, посредством которой 2 программы связывались бы(Они не на делфи).  Например одна программа чтото пишет в определённый участок памяти, другая читает и в зависимости от того, что туда записала первая, совершает определённые действия. Версия с "общением" программ посредством файла приводить не стоит, так как очень(!) важна скорость работы.

Покопав предварительно в инете, нашёл 1 более менее интересную ссылку на форум по той же теме, но честно говоря, просто напросто запутался. http://forum.shelek.ru/index.php/topic,7579.0.html

Может, кто-нибудь знает, как лучше сделать или даже имел опыт в написании подобного кода...
Заранее спасибо
PM MAIL   Вверх
Alexeis
Дата 5.10.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Micher, Да по ссылке как раз то что нужно. 
Еще можно при помощи WriteProcessMemory. Предварительно открыв при помощи OpenProcess.
Поищите в разделе "Delphi: WinAPI и системное программирование"


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ne0n
Дата 5.10.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 1
Всего: 11



Micher, никто тебе не даст рабоать с памятью напрямую....да и не нужно это)

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

сообщения:http://www.delphisources.ru/pages/faq/base/wm_cd_link.html
MMF ( демо от Rousе_): http://rouse.drkb.ru/winapi.php#mmf

Добавлено @ 14:26
Цитата(Alexeis @  5.10.2008,  14:08 Найти цитируемый пост)
Еще можно при помощи WriteProcessMemory. Предварительно открыв при помощи OpenProcess.

Alexeis,  а поделись информацией, как ?!smile проблема не в том как писать и читать, просто не могу так сходу сообразить - как найти область памяти, которая ненужна процессу и которая не  привед к ошибке?! (хоят вот только что придумал - можно создать какойнито пустой массив, вставить перед ним сигнатуру, искать в памяти ее, а потом писать...правда тут опять же жестко привязаны к размеру буфера-хз не згнаю такое будет рабоать или нет smile )

Это сообщение отредактировал(а) ne0n - 5.10.2008, 14:28
PM MAIL ICQ   Вверх
Alexeis
Дата 5.10.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



ne0n, Все правильно выделил участок памяти, передал его адрес процессу, который должен в него записать, и тот в свою очередь запишет в него.

Добавлено через 49 секунд
Нужно будет еще семафоров сделать, чтобы синхронизировать доступ к общей памяти


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Micher
Дата 5.10.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



Цитата(Alexeis @ 5.10.2008,  14:08)
Micher, Да по ссылке как раз то что нужно. 
Еще можно при помощи WriteProcessMemory. Предварительно открыв при помощи OpenProcess.
Поищите в разделе "Delphi: WinAPI и системное программирование"

А что конкретно то, что нужно? smile Там много всего, не знаешь за что и взяться. Я так понял, нужно использовать FileMapping, но не получается ли это тем же самым, что обмен данными через файл? Будет ли предлагаемый вариант быстрее работы через файл?
PM MAIL   Вверх
Micher
Дата 5.10.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



Цитата(ne0n @ 5.10.2008,  14:22)
если количество передаваеммых данных невилико - то можно воспользоваться сообщениями(там размер буфера ограничен, точно не помню сколько) или как уже писали на форуме, на который ты дал ссылку воспользоваться можно MMF.

сообщения:http://www.delphisources.ru/pages/faq/base/wm_cd_link.html
MMF ( демо от Rousе_): http://rouse.drkb.ru/winapi.php#mmf

http://rouse.drkb.ru/winapi.php#mmf - к сожалению, нерабочая ссылка.
По поводу сообщений написано следующее: "Есть одно условие -  приложение должно содержать окно". Моё приложение содержит окно(т.е. не просто висит где-то в памяти и чото тихо делает smile ), значит по видимому с этим проблем быть не должно. Ещё такой вопрос: дело в том, что мне нужно передавать очень небольшой объём информации между программами(может байт 10-20), но при этом довольно часто(5 раз в секунду). Там переполнение какое-нибудь не может случиться?

В общем, я что-то совсем запутался smile К сожалению, в Делфи не очень разбираюсь, а в тонкостях тем более. Что всё таки посоветуете из FileMapping и сообщений?
PM MAIL   Вверх
Alexeis
Дата 5.10.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(Micher @  5.10.2008,  20:29 Найти цитируемый пост)
Ещё такой вопрос: дело в том, что мне нужно передавать очень небольшой объём информации между программами(может байт 10-20), но при этом довольно часто(5 раз в секунду). Там переполнение какое-нибудь не может случиться?

  А насколько важен момент передачи? С какой точностью требуется синхронизация приложений. Для таких простых целей думаю хватит простого и стандартного механизма WM_COPYDATA


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Micher
Дата 5.10.2008, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



Цитата(Alexeis @ 5.10.2008,  21:43)
Цитата(Micher @  5.10.2008,  20:29 Найти цитируемый пост)
Ещё такой вопрос: дело в том, что мне нужно передавать очень небольшой объём информации между программами(может байт 10-20), но при этом довольно часто(5 раз в секунду). Там переполнение какое-нибудь не может случиться?

  А насколько важен момент передачи? С какой точностью требуется синхронизация приложений. Для таких простых целей думаю хватит простого и стандартного механизма WM_COPYDATA

2 приложения получают данные извне. Эти данные могут приходить очень по-разному: от нескольких раз в секунду до 1 раза в 3-5 секунд. Получив данные, 1 приложение должно обработать их и отослать информацию 2-му приложению(и наоборот)... по мере получения данных извне(т.е. если данные не поступают, то приложение не делает ничего).
PM MAIL   Вверх
Micher
Дата 6.10.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



С отправлением сообщений вроде разобрался, делаю так примерно:
Код

Function SendMes(): integer; export; stdcall;
var
  pril: hWnd;
  aCopyData: TCopyDataStruct;
 begin
   with aCopyData do
    begin
     dwData := 0;
     cbData := StrLen(PChar('Ot ulibki stanet vsem svetley!')) + 1;
     lpData := PChar('Ot ulibki stanet vsem svetley!')
    end;

   pril:= FindWindow(nil, 'ЗАГОЛОВОК ПРИЛОЖЕНИЯ, К-МУ ОТСЛЫАЕСТЯ СООБЩЕНИЕ');
   if pril <> 0 then
    begin
      SendMessage(pril, WM_COPYDATA, 0, Longint(@aCopyData));
      SendMes:=1;
    end else SendMes:=0;
 end;


Теперь не понятно, как ПРИНЯТЬ из другого приложения то, что посылает ему первое :-(
Нашёл такой примерно кусочек кода:
Код

...
type
   TForm1 = class(TForm)
     private
     procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
   public
   end;

procedure TForm1.WMCopyData(var Msg: TWMCopyData);
 var
   sText: array[0..99] of Char;
 begin
   // generate text from parameter
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
   // write received text
  ShowMessage(sText);
 end;
...


Но мне нужна функция(она не должна быть методом какого-либо класса), которая просто вернёт строку - которую посылается 1-м приложением...
PM MAIL   Вверх
Alexeis
Дата 6.10.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(Micher @  6.10.2008,  13:33 Найти цитируемый пост)
Но мне нужна функция(она не должна быть методом какого-либо класса), которая просто вернёт строку - которую посылается 1-м приложением... 

  Добавь в case функции главного окна WM_COPYDATA и напиши обработку.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Micher
Дата 6.10.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



Цитата(Alexeis @ 6.10.2008,  16:33)
Цитата(Micher @  6.10.2008,  13:33 Найти цитируемый пост)
Но мне нужна функция(она не должна быть методом какого-либо класса), которая просто вернёт строку - которую посылается 1-м приложением... 

  Добавь в case функции главного окна WM_COPYDATA и напиши обработку.

Честно говоря не очень понял вашу мысль smile А вообще код, который я привёл верный?
PM MAIL   Вверх
Alexeis
Дата 7.10.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(Micher @  6.10.2008,  15:38 Найти цитируемый пост)
 А вообще код, который я привёл верный? 

  На вид правильный. 

Цитата(Micher @  6.10.2008,  15:38 Найти цитируемый пост)
Честно говоря не очень понял вашу мысль 

Если модуль написан на WinApi то должна быть главная функция обработчик сообщений в ней и будет происходить обработка.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.