Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
6-24139
soho
2002-05-25 18:00
2002.08.08
Сетевой принтер


1-23980
иван
2002-07-25 16:11
2002.08.08
Господа великодушные


6-24155
niko4615
2002-05-29 10:28
2002.08.08
URL


3-23868
Китаец Ла Ме
2002-07-19 19:45
2002.08.08
МОЖНО ЛИ выполнить select-query для другого select-query?


1-24056
Kin
2002-07-23 20:55
2002.08.08
Скрытые файлы...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский