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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача массива в dll, как осуществить... 
:(
    Опции темы
tigger
Дата 6.2.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Вообщем есть программа, глобальный хук.
В dll необходимо передать массив THandle и там с ним работать.

В приложении пишу
procedure sethook(P:PP_ID; int:integer); external 'lib_hook.dll' name 'sethook';


Код

type
TP_ID = array of THandle;  
PP_ID = ^TP_ID;

var
array_id: PP_ID;

//далее идет заполнение и инициализация этого массива 2 элемента

GetMem(array_id, 2 * SizeOf(THandle));
       array_id^[0] := handle1;
       array_id^[1] := handle2;

sethook(array_id,2); //передача массива в dll



теперь в dll

Код

  TP_ID = array of THandle; 
  PP_ID = ^TP_ID;

  var
  MApp_tmp: PP_ID;

procedure sethook(pont:PP_ID; size:integer);
begin

     hMemFile := CreateFileMapping($FFFFFFFF,
      nil,                
      PAGE_READWRITE,    
      0,                 
      size*SizeOf(THandle),   
      'Global7v9k');

     MApp_tmp := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
        
//а вот здесь идут ошибки
                        MApp_tmp^[0]:=pont^[0];
                        MApp_tmp^[1]:=pont^[1];
//а вот здесь идут ошибки

end;




что может быть как лечить?


--------------------
user posted image
PM MAIL   Вверх
skyboy
Дата 6.2.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



tigger, sharemem или любой другой альтернативный менеджер памяти подключены и там, и там? в общем - проблем с доступом к совместно используемой памяти нет?
PM MAIL   Вверх
MetalFan
Дата 6.2.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



так. мне кажется не очень корректно объявлять указатель на дин.массив. и работать с ним через GetMem...
объяви уж тогда array [0..0] of... и отключи Range Checking



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 7.2.2007, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



sharemem не подключен попробую сделать.

Потом сообщу.


--------------------
user posted image
PM MAIL   Вверх
skyboy
Дата 7.2.2007, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



tigger, обрати внимание на слова MetalFan. Динамический массив != обычный массив. 
во-первых, можешь полезть в исходный код процедуры DynArraySetLength и увидеть, что как минимум на два longint'a длина структуры типа "динамический массив" больше суммы длин всех его составляющих элементов.
во-вторых, почему не пользуешь setlength и length для работы с динамическим массивом? брезгуешь, что ли?

Добавлено @ 02:49 
Цитата(tigger @  7.2.2007,  01:03 Найти цитируемый пост)
sharemem не подключен попробую сделать.

а ведь он обязан быть подключен, если в/из dll передаются: строки, динамические массивы и объекты(насчет последнего не уверен на 100%). т.е. всё то, что передается по ссылке и имеет неопределенный заранее размер. причем, при создании dll в Delphi wizard прямо так и пишет:
Цитата(Delphi IDE)

Important note about DLL memory management: ShareMem must be the   first unit in your library's USES clause AND your project's (select   Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This   applies to all strings passed to and from your DLL--even those that   are nested in records and classes. ShareMem is the interface unit to   the BORLNDMM.DLL shared memory manager, which must be deployed along   with your DLL. To avoid using BORLNDMM.DLL, pass string information   using PChar or ShortString parameters.

Цитата(Delphi IDE)

Важное замечание касательно управления памятью в DLL: ShareMem должен быть первым подключаемым модулем в разделе uses твоей dll-библиотеки и твоего проекта(выберите(в меню - прим. переводчика) "Project" -> "View source" -> "Project1.dpr") если твоя dll экспортирует функции или процедуры, которые принимают в качестве параметров или возвращают в качестве результата строки. Это относится ко всем строкам, передаваемым в/из dll, даже если они находятся в записях или внутри классов. SharEMem - это интерфейсный(только заголовки, никакого кода - прим. переводчика) к фалйу BORLNDMM.DLL - менеджеру разделяемой памяти, который должен поставляться с твоей dll. Чтобы не пришлось таскать за собой BORLNDMM.DLL, передавайте строковую информацию используя PChar или ShortString - параметры. 


PM MAIL   Вверх
tigger
Дата 7.2.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



пробовал Sharemem использовать и передавать тупо массивы THandle и такое ощущение что ловушка из глобальной переделалась в локальную, ничего кроме себя не отлавливает.


--------------------
user posted image
PM MAIL   Вверх
skyboy
Дата 7.2.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Цитата(tigger @  7.2.2007,  17:21 Найти цитируемый пост)
пробовал Sharemem использовать и передавать тупо массивы THandle и такое ощущение что ловушка из глобальной переделалась в локальную

может, поместить сюда код, который после переделки перестал работать? а то "на словах" можно только посочувствовать - не более того... 
PM MAIL   Вверх
remax
Дата 9.2.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

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



Для передачи массива в DLL можно использовать либо отображаемые в память файлы либо технологию интерфейсов.


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 9.2.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



А в чем вообще проблема? Передавайте массив как буфер данных и все. Если скопировать его по значению так вообще не будет ни каких проблем. Передавайте его не как массив, а как указатель на нулевой элемент и отдельно длину.
Код

procedure receiveBuf(buf : Pointer; l : length);
var
  data : array of integer;
begin
  SetLength(data, l);
  Move(buf^, data[0], l * Sizeof(integer));
end;

procedure SendBuf();
var
  data : array of integer;
Begin
  SetLength(data, 74);
  receiveBuf(@data[0], length(data));
end;



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

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

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


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



фактически тема продублирована автором в соседней теме

Цитата(Alexeis @  9.2.2007,  23:53 Найти цитируемый пост)
Передавайте его не как массив, а как указатель на нулевой элемент и отдельно длину.

а можно и еще проще - первые 2 байта - размер массива/записи) как в виндах cbSize первым полем идет во многих местах.



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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