Форум: "Основная";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
ВнизИнтерестно Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c