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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача измененного размера массива из Dll, передача измененного раз массива из Dll  
V
    Опции темы
Fakovka999
Дата 24.1.2017, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.1.2017

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



Здравствуйте извините если напишу что не понятно... пока не разбирался как и что здесь оформляется)
Проблема в чем? 
1. Хочу передать динамический массив в Dll-----------сделано (+)
2. Передать динамический массив из Dll обратно-----сделано (+)
3. Передать из Dll измененный размер Динамического массива ------- и вот тут я застрял...

Вопрос можно ли менять размер динамического массива переданного из программы в Dll в самом Dll?

Вот простые наброски для проверки что делал я...

Общий Type....
Код

type
  TPole = record
    _MInt:array of array of integer;
  end;


Модуль программы....
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  dHandle: THandle;
  FBeeline: function (Pole:TPole): TPole; stdcall;
begin
  SetLength(Pole._MInt,20,20);
  @FBeeline := nil;
  dHandle:=LoadLibrary('Beeline.dll');  //Грузим Dll
  if dHandle <> 0 then begin
      @FBeeline := GetProcAddress(dHandle,'FBeeline');
      if @FBeeline <> nil then begin
          Pole := FBeeline(Pole);
      end else
          Form1.Caption := 'Результат:Функция не найдена в Dll';
      FreeLibrary(dHandle);
  end else
      Form1.Caption := 'Результат:Библеотека не найдена';

  Pole._MInt := nil;
end;


Ну и сам Dll....
Код

Function FBeeline(Mas:TPole): TPole; stdcall;
begin
  SetLength(Mas._MInt,10,10);
  Result := Mas;
end;

exports FBeeline;


объясните пожалуйста почему так?
ах да... Ошибка EAccessViolation... обращение к несуществующему объекту...
PM MAIL   Вверх
bems
Дата 24.1.2017, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



используй ShareMem или SimpleShareMem


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Fakovka999
Дата 24.1.2017, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.1.2017

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



ShareMem проблему не решает...
Давайте не будем отвечать бездумно или в стиле Mail.ru "ответы"...
ShareMem может и решает проблемы, но все же больше увеличивает их...
использовалось уже ранее
Код

uses
  ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


PM MAIL   Вверх
bems
Дата 24.1.2017, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Fakovka999 @  24.1.2017,  09:17 Найти цитируемый пост)
ShareMem может и решает проблемы, но все же больше увеличивает их...

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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Fakovka999
Дата 24.1.2017, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.1.2017

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



При использовании sharemam выскакивает ошибка, в общемто та же самая только уже после закрытия программы((( вроде все высвободил и вроде передается и используется 1 блок памяти... Если можете попробовать у себя ( delphi 7) скажите работает ли у вас с моим кодом
PM MAIL   Вверх
bems
Дата 25.1.2017, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Fakovka999 @  24.1.2017,  10:32 Найти цитируемый пост)
При использовании sharemam выскакивает ошибка, в общемто та же самая только уже после закрытия программы(((

мне не удалось это воспроизвести. у меня та же ошибка не возникает. когда я по ошибке подключил ShareMem в юните формы, то возникла ошибка EInvalidPointer (то есть НЕ EAccessViolation). потом я перенёс ShareMem в самое начало секции uses проекта (как и должно быть) и ошибки при выходе из приложения исчезли вообще

Цитата(Fakovka999 @  24.1.2017,  10:32 Найти цитируемый пост)
вроде все высвободил и вроде передается и используется 1 блок памяти...
я тебе говорю что SetLength это выделение памяти (в случае если новый размер больше старого). Это выделение делается в dll. А потом в exe ты делаешь Pole._MInt := nil. И это освобождение. Здесь и ошибка если нет ShareMem

Цитата(Fakovka999 @  24.1.2017,  10:32 Найти цитируемый пост)
Если можете попробовать у себя ( delphi 7) скажите работает ли у вас с моим кодом 
попробовал. с ShareMem там где он должен быть всё работает



--------------------
Обижено школьников: 8
PM MAIL   Вверх
kami
Дата 27.1.2017, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(Fakovka999 @  24.1.2017,  04:43 Найти цитируемый пост)
можно ли менять размер динамического массива переданного из программы в Dll в самом Dll?

нельзя.
Последовательность (безо всяких ShareMem) должна быть такой:

Вариант 1 (попроще):
1. Приложение вызывает dll и спрашивает "какой размер массива тебе нужен, чтобы передать мне данные?"
2. Приложение выделяет именно такой размер
3. Приложение запрашивает dll с использованием указанного буфера.

Вариант 2 решил не писать, там сложновасто.
В любом случае - нельзя из одного модуля менять память, выделенную в другом модуле. ShareMem - это хорошо, до тех пор, пока работа ведется только на Delphi (кажется есть еще условие - одной версии, но здесь могу ошибаться).
PM MAIL WWW   Вверх
Fakovka999
Дата 27.1.2017, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.1.2017

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



Ладно будем пробовать... почитал литературу... примерно разобрался что и как работает... пока вроде получается... Спасибо... smile  smile

Добавлено через 14 минут и 27 секунд
м кстате такая штука... я понимаю что это вроде как не правильно но это работает)))


допустим в программе....
Код

type
    TPole = array of array of integer;
...
var
    a,b:TPole;
begin
    SetLength(a,2,2); //выделяем под 'a' массив 2х2 
    b := a;  //передаем в 'b'
......
    //ну и сначала мы удаляем 'b' а потом 'a'
    b:=nil;
    a:=nil;


а вот в функции (Dll)...

Код

TPole = array of array of integer;
Function a(a:TPole): TPole;
var
    b:TPole;
begin
    SetLength(b,2,2);
    ....... какие-то манипуляции
    result := b;
    b := nil;
end;


по идее массив 'b' перехвачен 'а' и освобождать мы должны сначала 'а', а потом b... но правильно ли будет если сделать так... хотя все работает

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


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.1.2017

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



Цитата(bems @ 25.1.2017,  04:08)
Цитата(Fakovka999 @  24.1.2017,  10:32 Найти цитируемый пост)
вроде все высвободил и вроде передается и используется 1 блок памяти...
я тебе говорю что SetLength это выделение памяти (в случае если новый размер больше старого). Это выделение делается в dll. А потом в exe ты делаешь Pole._MInt := nil. И это освобождение. Здесь и ошибка если нет ShareMem

блин да точно... ступил опять... сори
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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