Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.08;
Скачать: CL | DM;

Вниз

Интерестно   Найти похожие ветки 

 
Nostradamus ©   (2002-07-26 23:48) [0]

1. в одной из ф-ций dll вызываемых из главной проги был как параметр открытый массив - при закрытии прога висла вместе со средой
2. добавил и в dll и в прогу ShareMem - прога при закрытии выдавала EInvalidPointer и опять же всё висло
3. Убрал открытый массив, но оставил ShareMem - опять EInvalidPointer
4. Убрал и окрытый массив и ShareMem - всё работает
Не пойму п. 2 - 4


 
Юрий Зотов ©   (2002-07-27 00:29) [1]

> добавил и в dll и в прогу ShareMem

Куда именно и каким по счету?


 
Nostradamus ©   (2002-07-27 02:39) [2]

в основной uses, 1м т.к. в хелпе первым было написано


 
Юрий Зотов ©   (2002-07-27 07:39) [3]

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

Надо локализовывать. Попробуйте понаставить BreakPoint"ов в секциях finalization (если они есть) и в методах Destroy используемых классов, а потом пройти закрытие под отладчиком.


 
Nostradamus ©   (2002-07-27 16:51) [4]

В том то и проблема что нет ни finalization в dll ни даже OnDestroy в программе. Да и ошибка же исчезла после того как я убрал открытый массив и ShareMem.


 
DiamondShark ©   (2002-07-27 17:25) [5]

Так не бывает.
Если речь идет именно об открытом массиве (и Вы не путаете его с динамическим), то никакого отношения это к ShareMem не имеет.
Параметр-открытый массив фактически представляет собой два параметра: первый -- явный var-параметр, второй -- неавный параметр-значение, представляющий длину.
Как видите, никаких проблем с передачей данных между модулями нет и быть не может.

Причин может быть две.

Первое. Ошибка в вашей программе. Тот факт, что ошибка исчезает при изменении параметров ни о чем не говорит: изменив параметры вы вынуждены были менять и текст процедуры

Второе. Существует документированый глюк компилятора при наличии в параметрах открытого массива и параметра со значением по умолчанию. Неверно формируется вызов при вызове с умолчанием. При этом при возврате нарушается стек. Последствия этого могут проявиться очень далеко от места вызова.

Какой случай вам подходит?


 
Юрий Зотов ©   (2002-07-27 17:28) [6]

OnDestroy - нет, а деструкторы есть?
Двойное уничтожение какого-то объекта исключено?
Или двойное освобождение памяти по одному и тому же адресу?
А секции finalization есть в VCL - значит, они есть и в Вашей программе (если, конечно, она использует VCL).

То, что исчезло СООБЩЕНИЕ об ошибке еще не говорит о том, что исчезла САМА ошибка. Могли просто исчезнуть условия, при которых она проявляется - но нет гарантии, что при каком-то стечении обстоятельств они снова не возникнут.

Поэтому советую все же вставить массив и ShareMem обратно и пройти отладчиком. Чтобы точно выяснить причину.

Впрочем, дело хозяйское...


 
Nostradamus ©   (2002-07-27 18:01) [7]

>DiamondShark
Я не путаю это ТОЧНО открытый массив.
Значений по умолчание тоже не было.
Код изменился с:

while Length(S) > 0 do begin
SetLength(TempAr, N + 1);
N1 := StrToInt(Copy(S, 1, P - 1));
case N1 of
0..8 : TempAr[N] := Plr.Bonuses[N1];
9 : TempAr[N] := Plr.Know[0];
10 : TempAr[N] := MyTime;
end;
Delete(S, 1, P);
P := Pos(";", S);
Inc(N);
end;
ExecuteAct(Res, PChar(ActList.Items[ActList.ItemIndex]), TempAr); //это ф-ция с длл

на такой:

P := Pos(";", S);
ResStr := "";
while Length(S) > 0 do begin
N1 := StrToInt(Copy(S, 1, P - 1));
case N1 of
0..8 : ResStr := ResStr + IntToStr(Plr.Bonuses[N1]) + ";";
9 : ResStr := ResStr + IntToStr(Plr.Know[0]) + ";";
10 : ResStr := ResStr + IntToStr(MyTime) + ";";
end;
Delete(S, 1, P);
P := Pos(";", S);
end;
ExecuteAct(Res, PChar(ActList.Items[ActList.ItemIndex]), PChar(ResStr));

Могло ли это повлиять не знаю.

>Юрий Зотов
В моих классах деструкторов нет - они простенькие
Я всё проверил - двойного уничтожения не нашёл, освобождения памяти тоже. По поводу finalization - я имел ввиду нет в моей длл.
Сеёчас попробую вернуть старый код и пройтись отладчиком ещё раз но не знаю что у меня с этого полутся...


 
Nostradamus ©   (2002-07-27 18:07) [8]

Да ещё кое-что в длл у меня несколько форм. И причём ошибка появляется только если я их несколько раз из длл вызываю:
на пр.

type
TResRec = record
Variables : array [0..11] of Integer;
NewHS : array [0..99] of TBought;
NewJob : Integer;
NewISP : Integer;
MoodChange : Integer;
end;

...

if ActName = ActAr[0] then begin
try
ShopForm := TShop.Create(Application);
ShopForm.PCShop(ValInfo[0], ValInfo[1], ValInfo[2]);
ShopForm.ShowModal;

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

Res.Variables[0] := -StrToInt(ShopForm.BLabel.Caption);
finally
ShopForm.Free;
end;
end;




Страницы: 1 вся ветка

Текущий архив: 2002.08.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
4-24261
AlexanderSK
2002-05-24 15:36
2002.08.08
Глупый вопрос! Но...


14-24183
^Sanya
2002-07-08 00:11
2002.08.08
Почём нынче лицензионное Delphi? (5,6)


4-24275
Baz
2002-05-31 10:50
2002.08.08
Как правильно обрабатывать сообщение WM_PAINT?


14-24215
MIFI
2002-07-14 22:18
2002.08.08
CMEII и GMT что это и откуда


1-23969
Arhangel
2002-07-25 15:47
2002.08.08
Иконки