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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический массив и DLL 
:(
    Опции темы
former
Дата 19.1.2007, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


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

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



Появилась такая проблема. Не могу заполнить динамический массив в DLL, переданный из программы.

Текст приложения:
Код

unit uMainForm;

interface

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

type
  TMainForm = class(TForm)
     Button1:TButton;
     ML:TValueListEditor;
     procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const PluginsM:array[1..2] of PAnsiChar = ('mmgll001.dll','mmgll002.dll');

var
  MainForm: TMMGMainForm;
  ParCount:integer;
  InitParam:array of real;

implementation

{$R *.dfm}


procedure TMainForm.Button1Click(Sender: TObject);
var LibHandle: THandle;
    fGiveParToVar: procedure (ParMass:array of real; MatL:TValueListEditor);  
begin
  SetLength(InitParam,0);
  for i:=1 to ParCount do SetLength(InitParam,Length(InitParam)+i);
  LibHandle := LoadLibrary(PluginsM[CurentConstr]);
  if LibHandle = 0 then
    raise Exception.Create('Невозможно загрузить библиотеку '+PluginsM[CurentConstr])
  else
  begin
    try @fGiveParToVar:= GetProcAddress(LibHandle, 'GiveParToVar');
      if @fGiveParToVar <> nil then fGiveParToVar(InitParam,MList);
    except
      on E: Exception do ShowMessage('Ошибка: ' + E.Message);
    end;
  end;
  FreeLibrary(LibHandle);
end;

end;


Текст DLL:
Код

library mmgll001;

uses
  ShareMem,
  SysUtils,
  Classes,
  ValEdit;

{$R *.res}

procedure GiveParToVar(ParMass:array of real; MatL:TValueListEditor);
begin

  ParMass[0]:=StrToFloat(MatL.Cells[1,1]);
end;

exports
  GiveParToVar;

begin
end.


Подскажите, в чём ошибка?


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
skyboy
Дата 19.1.2007, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(former @  18.1.2007,  23:37 Найти цитируемый пост)
Не могу заполнить динамический массив в DLL, переданный из программы.

почему? религия не позволяет? 
давай так: 
- если вываливается ошибка - ты о ней сообщаешь в первом, а не в пятом посте темы;
- если наблюдается логическая нестыковка ожидаемого и полученного - тщательно описываешь ожидаемое и приводишь пример полученного;
- если просто забыл запустить компилятор - помечаешь вопрос решенным;
договорились? 
пока догадываться не буду, толь замечу, что модуль sharemem должен быть подключен и в списке uses project.dpr

Добавлено @ 02:05 
Цитата(former @  18.1.2007,  23:37 Найти цитируемый пост)
@fGiveParToVar

насколько мне помнится, оператор взятия адреса необязателен. если вообще допустим.
PM MAIL   Вверх
Guedda
Дата 19.1.2007, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


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

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



Интересно. А где в коде ты выделяешь под динамический массив память?
Код

SetLength() //рулит ;)



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 19.1.2007, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Guedda, 
Цитата(former @  19.1.2007,  00:37 Найти цитируемый пост)
  SetLength(InitParam,0);  for i:=1 to ParCount do SetLength(InitParam,Length(InitParam)+i);
Правда более нелепого выделения я ещё не видел.
Зачем цикл??!!!
PM MAIL   Вверх
VICTAR
Дата 19.1.2007, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я так подозреваю, что это должно выглядеть так:
Код

fGiveParToVar: procedure (var ParMass:array of real; MatL:TValueListEditor);  

иначе ИМХО просто нет смысла в этой процедуре.

И обязательно

Цитата(skyboy @  19.1.2007,  02:00 Найти цитируемый пост)
модуль sharemem должен быть подключен и в списке uses project.dpr


ЗЫ может здесь скрытый смысл, но
Код

for i:=1 to ParCount do SetLength(InitParam,Length(InitParam)+i);

легче сделать 
Код

SetLength(InitParam, ParCount);


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


MEMS Expert
***


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

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



Приношу извинения за не полностью отражённую проблему и некоторые ошибки в приведённом коде. Просто, вытаскивал этот кусок кода из основной программы и не всё правильно скопировал. 

Главная проблема состоит в том, что массив после возврата из  DLL остаётся пустым.

Цитата(skyboy @  19.1.2007,  02:00 Найти цитируемый пост)
пока догадываться не буду, толь замечу, что модуль sharemem должен быть подключен и в списке uses project.dpr


skyboy, модуль ShareMem к проекту у меня подключен.


Цитата(Guedda @  19.1.2007,  02:07 Найти цитируемый пост)
Интересно. А где в коде ты выделяешь под динамический массив память?

код Pascal/Delphi
1: SetLength() //рулит ;)


Цитата(Snowy @  19.1.2007,  02:38 Найти цитируемый пост)
Правда более нелепого выделения я ещё не видел.
Зачем цикл??!!! 


Guedda, Snowy и VICTAR абсолютно с вами согласен. Ерунду написал.


Цитата(VICTAR @  19.1.2007,  02:41 Найти цитируемый пост)
Я так подозреваю, что это должно выглядеть так:
код Pascal/Delphi
1: fGiveParToVar: procedure (var ParMass:array of real; MatL:TValueListEditor);


VICTAR, ты абсолютно прав. Всё заработало.

Надо выспаться и быть по внимательнее, а то начинаю в трёх соснах блуждать.

Всем большое спасибо за помощь.

Добавлено @ 08:46 
Всем ставлю по плюсу.  smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
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.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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