Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку, что-то странное :/ 
:(
    Опции темы
Illusion Dolphin
  Дата 10.8.2004, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Люди! Человеки! Которую неделю видел в программе один странный глюк, но всё руки не доходили, а теперь дошли :/... День сидел в отладке и поисках - ноль по фазе. В общем - ошибка при работе с памятью (90% - все симптомы). Не удаётся выделить тот кусок программы, который даёт ошибку, поэтому я её обрезал до "необходимого минимума ошибки":

Вот тут исходники

Пожалуйста, посмотрите, в чём дело. Компилировал на делфи7. Для того, чтобы произошла ошибка нужно создать папку "C:\Dolphin\1\234' (да можно любое, просто по умолчанию такая была smile.gif, хотя последнее имя (234) - вообще не имеет значения). После запуска программы появится окно мини-проводника, где будет видна одна папка - "234" (т.к. папка по умолчанию - "C:\Dolphin\1"). нужно выделить эту единственную папку, нажать на F2 и переименовать в любое другое имя. После этого или вылазит ошибка или всё просиходит молча, но если снять выделение с папки и опять выделить её, то появится имя "%SystemRoot%\System23\Shell32.dll" (%SystemRoot% - папка винды). Откуда берётся ошибка? ПОЖАЛУЙСТА, КТО ХОРОШО ЗНАЕТ ДЕЛФИ -- ПОСМОТРИТЕ, пожалуйста!


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 10.8.2004, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Немного глянул...
Цитата
"%SystemRoot%\System23\Shell32.dll"

Это происходит на ExtractAssociatedIcon - посмотри недавние темы, была темка про ошибку в этой функции (она изменяет FileName, хотя не должна... sad.gif)
Цитата
нажать на F2 и переименовать в любое другое имя. После этого или вылазит ошибка

Если закомментировать строку:
TExplorerThreadNotifyDirectoryChange.Create(False,s,DirectoryChanged,CurrentGUID,@CurrentGUID);
то ошибки не происходит, видимо ошибка тут...
Если присмотреться, то сомнительным кажется код:
Код
  FileName:='';
  GetMem(FileName,PFileNotifyInformation(Ptr).FileNameLength + 2);
  ZeroMemory(FileName,PFileNotifyInformation(Ptr).FileNameLength*4 + 2);
  lstrcpynW(FileName,PFileNotifyInformation(Ptr).FileName, PFileNotifyInformation(Ptr).FileNameLength div 2+1);
  SFileName:=FileName;
  FreeMem(FileName);

Выделяется памяти FileNameLength + 2, а обнуляется в 4 раза больше...
А я делал так, чтобы особо не мудрить:
Код

  SetLength (ws, PFileNotifyInformation(Ptr).FileNameLength div 2);
  CopyMemory (@ws[1], @PFileNotifyInformation(Ptr).FileName, PFileNotifyInformation(Ptr).FileNameLength);
  SFileName := ws;
(ws : WideString);
Заменив этот код , и убрав этот кусок:
Код
{     ico:=TIcon.Create;
    Ico.Handle:=ExtractAssociatedIcon(HInstance, PChar(FileName), IconIndex);
    Canvas.Draw(ThImageSize div 2-Ico.Width div 2,ThImageSize div 2-Ico.Height div 2,Ico);
    Ico.free;}

Ошибок больше не вылазило, но почему-то переименование отлавливается только 1 раз... Это видимо уже где-то логическая ошибка...



--------------------
С уважением, г-н Посол.
PM   Вверх
Illusion Dolphin
Дата 10.8.2004, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата
Это происходит на ExtractAssociatedIcon - посмотри недавние темы, была темка про ошибку в этой функции (она изменяет FileName, хотя не должна... )

Да, это один из "интересных мест". действительно, с этой функцией были неполадки (я это давно заметил, но в связи с тем, что это не единственное место такого типа, не убирал его). Я поищу на эту тему справку. А в чём точно эта ошибка выражается? Почему она лезет совсем в "левую" память?

Цитата
Выделяется памяти FileNameLength + 2, а обнуляется в 4 раза больше...

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

P.S. нашёл топик по ExtractAssociatedIcon... это по-моему то, что и было...


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Петрович
Дата 11.8.2004, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(p0s0l @ 10.8.2004, 21:19)
Это происходит на ExtractAssociatedIcon - посмотри недавние темы, была темка про ошибку в этой функции (она изменяет FileName, хотя не должна... )

Это не ошибка!
Читайте MSDN:
Цитата
lpIconPath
[in] Pointer to a string that specifies the full path and file name of the file that contains the icon. The function extracts the icon handle from that file, or from an executable file associated with that file.
If the icon handle is obtained from an executable file, the function stores the full path and file name of that executable in the string pointed to by lpIconPath.


to Illusion Dolphin
Цитата
Да, это один из "интересных мест". действительно, с этой функцией были неполадки (я это давно заметил, но в связи с тем, что это не единственное место такого типа, не убирал его). Я поищу на эту тему справку. А в чём точно эта ошибка выражается? Почему она лезет совсем в "левую" память?

Поищи, то ли здесь, то ли на сорсах я об этом уже писал.
Если кратко, то:
ExtractAssociatedIcon в lpIconPath возвращает измененный путь. Причем, иногда, как в твоем случае этот путь длинее чем тот который ты ему передал. Вот ExtractAssociatedIcon и вылезает за пределы той памяти гда у тебя размещался путь передаваемый в него.
Надо перед вызовом ExtractAssociatedIcon создать буфер размером MAX_PATH символов (+1 для завершающего #0), скопировать туда твой путь, и именно этот буфер передавать в ExtractAssociatedIcon.

Это сообщение отредактировал(а) Петрович - 11.8.2004, 09:10


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.