![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с 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 ДИНАМИЧЕСКИ!?