![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Unconnected |
![]()
Сообщение
#1
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
...и почему-то никто почти не знает толком, от чего она берётся. На куске кода:
Procedure ssendfile;
var fm,fm2:TFilestream;
begin
try
fm:=TFileStream.Create(form7.Edit1.Text, fmOpenRead);
fm.Position:=0;
fm2:=TfileStream.create('temp',fmcreate);
fm2.position:=0;
cipher.initstr(key,tdcp_sha1);
cipher.EncryptStream(fm,fm2,fm.size);
cipher.burn;
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
fm2.position:=0;
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fm2.Size)+ #0);
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fm2.size);
form1.ClientSocket1.Socket.SendStream(fm2);
form7.edit1.text:='';
form7.hide;
fm.free;
fm2.Free;
except
showmessage('Ошибка!');
end;
end;
вылетает Invalid Pointer Operation и вдобавок ещё одна ошибка с длинным содержанием, начинается "Unhabled execution in...". Было ещё несколько моментов с вылетом ошибки, но их я сумел исправить сам, здесь не получается.. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Локализуй место ошибки... Лучше всего для этого пользоваться FastMM. Как - см. здесь. Можешь поставить в каждой строке BreakPoint-ы, и посмотреть, в какой именно строке происходит вылет.
А вообще, Invalid Pointer Operation - это ошибка работы с памятью. |
Unconnected |
![]()
Сообщение
#3
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Поставил брекпоинты, оттрассировал(кажется, так это называется), ошибка на строке
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
и выдаётся Цитата '' is not valid integer value . Я подумал на преобразование inttostr и сделал так:showmessage(inttostr(form1.listbox2.itemindex));
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
Сообщение 1.. Программа порадовала ![]() Эскизы прикрепленных изображений ![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
А чему должно было быть равно значение ItemIndex? Ты что-то выбирал в ListBox-е?
|
Unconnected |
![]()
Сообщение
#5
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Да, там сначала кликаешь на ник пользователя, а потом отправка. Причём аналогичная процедура без шифрования работает. К тому же с брекпойнтами на этой строке появляется окно с ассемблерным кодом и той же ошибкой.
Добавлено через 3 мин. Вот обе рядом, первая работает на отлично. Procedure sendfile;
Var
fs: TFileStream;
Begin
fs:=TFileStream.Create(form7.Edit1.Text, fmOpenRead);
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
Try
fs.Position:=0;
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fs.Size)+ #0);
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fs.size);
form1.ClientSocket1.Socket.SendStream(fs);
form7.edit1.text:='';
form7.hide;
Finally
end;
End;
Procedure ssendfile;
var fm:TFilestream;
fm2:TMemoryStream;
begin
fm:=TFileStream.Create(form7.Edit1.Text, fmOpenRead);
fm.Position:=0;
fm2:=TMemoryStream.create;
fm2.position:=0;
cipher.initstr(key,tdcp_sha1);
cipher.EncryptStream(fm,fm2,fm.size);
cipher.burn;
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
Try
fm2.Position:=0;
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fm2.Size)+ #0);
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fm2.size);
form1.ClientSocket1.Socket.SendStream(fm2);
form7.edit1.text:='';
form7.hide;
Finally
fm.free;
fm2.Free;
end;
end;
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Попробуй сделать Cipher локальной переменной, а не глобальной... Что-то мне кажется, что надо его освобождать (Free), прежде чем обращаться к результатам шифрования. И, заодно, проверь, где именно портится значение form1.listbox2.itemindex, то есть выводи его перед каждой строкой работы с cipher.
|
Unconnected |
![]()
Сообщение
#7
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Сделал локальными, но смысла в этом в принципе нет, т.к. принимает поток другая копия программы, и к тому же вызывается cipher.burn.
Несколько часов тестил программу, результаты.. procedure TForm7.Button2Click(Sender: TObject); //здесь происходит выбор, какую процедуру вызывать. Shifr2=true
begin
if shifr2=false then SendFile
else ssendfile;
end; //!!!
Procedure ssendfile;
var fm:TFilestream;
fm2:TMemoryStream;
begin
fm:=TFileStream.Create(form7.Edit1.Text, fmOpenRead); //ок
fm.Position:=0; //ок
fm2:=TMemoryStream.create; //ок
fm2.position:=0; //ок
cipher.initstr(key,tdcp_sha1); //ок
cipher.EncryptStream(fm,fm2,fm.size); //ок
cipher.burn; //ок
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex)); //ок
Try
fm2.Position:=0; //ок
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fm2.Size)+ #0); //ок
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fm2.size); //ок
form1.ClientSocket1.Socket.SendStream(fm2); //ок
form7.edit1.text:=''; //ок
form7.Hide; //?
Finally
fm.free; //ок
fm2.Free; //ок
end;
end;
Ок - ошибок при прохождении не возникает. На строке, помеченной "?", переход в модуль CoolTrayIcon.pas(при чём он здесь - не понимаю, на эту форму он вообще не должен воздействовать), и далее на строке, помеченной "!!!" (в самом верху) ошибка. Сообщение отредактировано: Unconnected - 22.02.2009 13:09 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата Сделал локальными Правда? А где описание переменной внутри процедуры SSendFile? Где локальность-то? Я ж говорил: Создавать и уничтожать cipher ВНУТРИ процедуры, а не где-то там, извне, и только после уничтожения обращаться к шифрованному потоку (то, что у тебя сейчас происходит - это не называется "работает", это называется глючит неизвестно где)... У тебя вон и так непонятно что с формами творится, наплодил глобальных переменных, получи результат... |
Unconnected |
![]()
Сообщение
#9
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Если сделать локальной для Ssendfile - Self Undeclared Identifier в конструкторе.
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Ну, так значит что-то ты делаешь не так... Открой примеры, идущие с библиотекой, и убедись, что ВЕЗДЕ cipher описывается локально, и все работает.
|
Unconnected |
![]()
Сообщение
#11
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Ура!!!!!!!!!!!!!!!! Сделал процедуру SSendfile принадлежащей к форме, Self активировался, потом сетевая зараза вызвала buffer overflow...потом ещё немного танцев с бубном.. Спасибо огромное, volvo!!!!!!!!!!!!
![]() ![]() ![]() Кстати, если везде используются локальные переменные - это не всегда хорошо. Я их сделал локальными везде, где только возможно, и приём файла работать с локально описанным потоком почему-то не захотел, только с глобальным, хотя этот поток больше нигде не использовался. Сообщение отредактировано: Unconnected - 22.02.2009 21:58 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
![]() ![]() |
![]() |
Текстовая версия | 24.07.2025 15:26 |