Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с DLL [D5, Win95/98]


Nostradamus ©   (2002-07-23 17:29:00) 

Моя программа вызывает ф-цию в длл создающую форму (которая в той же длл), юзер чё-то выбирает и потом результат возвращается и форма удаляется из памяти. Вроде бы всё нормально компилируется но прога постоянно крэшится.
Привожу частично код:
- в проге... -
type
TResRec = record
Variables : array [0..11] of Integer;
NewHS : array of TBought;
NewJob : Integer;
NewISP : Integer;
end;
...
function ExecuteAct(ActName : PChar; ValInfo : array of Integer) : TResRec; external "ACTIONS.DLL" name "ExecuteAction";
...
procedure TMain.BitBtn2Click(Sender: TObject);
var
MyTime : Integer;
Res : TResRec;
begin
MyTime := (5 - (gMonth mod 4)) * (gYear - 1995);
Res := ExecuteAct("PC Shop", [Plr.Bonuses[1], Plr.Know[0], MyTime]);
Plr.Know[0] := Plr.Know[0] - Res.Variables[0];
...
- в длл...
library actions;

uses
Forms, typelibU, SysUtils,
ShopU in "ShopU.pas"; {Shop}
...

//Эта ф-ция не совсем дописана
function ExecuteAction(ActName : PChar; ValInfo : array of Integer) : TResRec;
var
ShopForm : TShop;
I : Integer;
Res : TResRec;
begin
if ActName = "PC Shop" then begin
try
ShopForm := TShop.Create(Application);
ShopForm.PCShop(ValInfo[0], ValInfo[1], ValInfo[2]);
ShopForm.ShowModal;

SetLength(Res.NewHS, Length(ShopForm.BoughtWhatAr));
for I := Low(ShopForm.BoughtWhatAr) to High(ShopForm.BoughtWhatAr) do
Res.NewHS[I] := ShopForm.BoughtWhatAr[I];

Res.Variables[0] := -StrToInt(ShopForm.BLabel.Caption);
Res.NewJob := -1;
Res.NewISP := -1;
finally
ShopForm.Free;
end;
Result := Res;
end;
end;
...
exports
ExecuteAction;


Nostradamus   (2002-07-23 18:28:00) [1]

Digitman и Skier спасибо за советы.
Чувствую действительно нужно переделать всё это дело так чтоб без дин. массивов было.
Сейчас попробую что вы написали. Думаю теперь получится всё.


Skier   (2002-07-23 18:21:00) [2]

>Nostradamus
>Nostradamus

Если честно, то твоя запись TResRec и параметры DLL функции
это вообще хулиганство.

Например
1)ValInfo : array of Integer можно заменить
PChar-ом где элементы будут разделены запятыми.

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


Digitman   (2002-07-23 18:20:00) [3]

>Nostradamus

uses ShareMem, ...

И в хост-приложении и в DLL должно быть
это - как минимум ...

Но не есть это хорошо - взаимодействие модулей приложения через открытые массивы, дин.массивы и иже с ними


Nostradamus   (2002-07-23 18:12:00) [4]

чё-то с указателем тоже не складывается. Может напиши как ТЫ себе это представляешь с указателем...


Nostradamus   (2002-07-23 18:05:00) [5]

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


Skier   (2002-07-23 17:37:00) [6]

>Nostradamus
И открытый массив не пробовал убирать !!!???


Skier   (2002-07-23 17:33:00) [7]

>Nostradamus

!!!???

А ты указатель PResRec = ^TResRec не пытался
использовать и создавать TResRec ДИНАМИЧЕСКИ!?


Наверх

Титульная страница Поиск, карта сайта Написать письмо