Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

Странная ошибка   Найти похожие ветки 

 
Андрей Молчанов   (2005-11-07 13:40) [0]

У пользователя (W2K Prof.Rus.SP4) постоянно появляется ошибка - если открыть из моей программы хелп и затем выйти через меню в трее, то появляется Access Violation. При этом, если выйти через главное меню, ошибка не воспроизводится, несмотря на то, что ссылаются они на одну и ту же процедуру.

На моем компьютере ошибку можно воспроизвести только в отладчике и то через раз. Вроде бы помогло поставить в файле проекта после Application.Run; Sleep на 100 мсек, но этот вариант достаточно кривой и мешает в другой части программы.

Гугль ответа не дал. Пожалуйста, подскажите куда копать.


 
Del_programmer ©   (2005-11-07 14:58) [1]

даже и не знаю


 
Amoeba ©   (2005-11-07 17:36) [2]


> Вроде бы помогло поставить в файле проекта после Application.
> Run; Sleep на 100 мсек, но этот вариант достаточно кривой
> и мешает в другой части программы.

Пляски с бубном.


 
Андрей Молчанов   (2005-11-07 19:08) [3]

Мне кажется, что что-то не успевает выгрузиться из памяти. Но вот что?


 
Digitman ©   (2005-11-08 09:24) [4]


> появляется Access Violation


В тексте, сообщающем об исключении, содержится весьма важная для поиска "неисправности" адресная инф-ция, и адресована она не юзеру, а программисту


 
Digitman ©   (2005-11-08 09:26) [5]

Choose Search|Find Error to display the Find Error dialog box.

Find Error dialog box

Use this dialog box to specify the address of the most recent runtime error.

Error Address The address of the most recent runtime error and the error number appears in the runtime error report if it is available.

When you click OK, you are taken to the address location you entered and the line that caused the runtime error is highlighted.


 
Андрей Молчанов   (2005-11-08 18:44) [6]

Вот скриншот дебаггера: http://www.doublesafety.com/debugger.gif (30Kb)
Почему то все окошко в вопросительных знаках. Таким образом, Search|Find Error ответов не дает :(

Кстати, если поставить точку останова на самый последний end. в файле проекта, то ошибки (в дебаггере) не будет.


 
umbra ©   (2005-11-08 18:56) [7]

(*телепатор включен*)

косяк в деструкторе главной формы

(*телепатор выключен*)


 
Андрей Молчанов   (2005-11-08 22:27) [8]

Нашел вроде :)
Вот, исходный код (упрощенный):
unit Unit4;

interface

uses
 SysUtils, Classes, Windows;

type
 TdmMain = class(TDataModule)
   procedure DataModuleCreate(Sender: TObject);
 private
   { Private declarations }
 public
   procedure HelpJump(TopicId: string);
 end;
 THtmlHelpA = function(hwndCaller: THandle; pszFile: PChar; uCommand: Cardinal; dwData: Longint): THandle; stdcall;

var
 dmMain: TdmMain;
 HtmlHelpA: THtmlHelpA;
 OCXHandle: THandle;

implementation

{$R *.dfm}

procedure TdmMain.HelpJump(TopicId: string);
begin
 if Assigned(HtmlHelpA) then
   HtmlHelpA(0, PChar(Application.HelpFile+"::/"+TopicId), 0, 0);
end;

initialization
 HtmlHelpA := nil;
 OCXHandle := LoadLibrary("HHCtrl.OCX");
 if OCXHandle <> 0 then begin
   HtmlHelpA := GetProcAddress(OCXHandle, "HtmlHelpA");
 end;

finalization
 //Проблему вызывает вот эта строка. Если ее убрать, то все будет правильно. По крайней мере у меня.
 if OCXHandle <> 0 then FreeLibrary(OCXHandle);

end.


В связи с чем еще один вопрос - будет ли правильным использование такого кода, если на машине не установлен HtmlHelp? Хотя бы не будет Access Violation?

unit Unit4;

interface

uses
 SysUtils, Classes, Windows;

type
 TdmMain = class(TDataModule)
   procedure DataModuleCreate(Sender: TObject);
 private
   { Private declarations }
 public
   procedure HelpJump(TopicId: string);
 end;
 function HtmlHelp(hwndCaller: HWND; pszFile: string; uCommand: Integer; dwData: integer): HWND; stdcall; external "hhctrl.ocx" name "HtmlHelpA";

var
 dmMain: TdmMain;

implementation

{$R *.dfm}

procedure TdmMain.HelpJump(TopicId: string);
begin
 HtmlHelpA(0, PChar(Application.HelpFile+"::/"+TopicId), 0, 0);
end;

end.


 
Digitman ©   (2005-11-09 09:09) [9]


> Таким образом, Search|Find Error ответов не дает


оч даже дает.

адрес $5D324347 принадлежал одному из pe-модулей, которые были загружены (статически или динамически) в АП процесса в ходе его старта и работы

а что за модуль - это можно легко выяснить средствами любой из подходящих утилит, просматривающих состав используемых процессом в ран-тайм pe-модулей


> будет ли правильным использование такого кода, если на машине
> не установлен HtmlHelp? Хотя бы не будет Access Violation?
>


при отсутствии на машине модуля hhctrl.ocx система известит об этом и откажет в старте приложения

кстати, не оч понятно, почему hhctrl.ocx используется как обычная dll, а не как AX-библиотека


 
YuRock ©   (2005-11-09 09:22) [10]

> кстати, не оч понятно, почему hhctrl.ocx используется как обычная dll, а не как AX-библиотека

Наверно потому, что тупо вызывается HtmlHelpA - а чаще всего она работает и простым вызовом :)


 
Андрей Молчанов   (2005-11-09 19:08) [11]

Все, наконец то понял в чем была проблема! Перед выходом надо было вызывать HtmlHelp(0, nil, HH_CLOSE_ALL, 0); , тогда ошибки нет. Видимо это особенности Windows и HtmlHelp. Digitman, спасибо.


> а что за модуль - это можно легко выяснить средствами любой
> из подходящих утилит, просматривающих состав используемых
> процессом в ран-тайм pe-модулей


А не могли бы Вы посоветовать какую-нибудь утилиту такого типа. Я бы погуглил, но ключевых слов как то не нахожу.



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

Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
3-1129360635
Иванов__
2005-10-15 11:17
2005.11.27
Ош. "Could not convert variant of type (NULL) into type (String)"


2-1131304186
ЯТутаНовичек
2005-11-06 22:09
2005.11.27
Помогите с TDate


2-1131714423
De1uxe
2005-11-11 16:07
2005.11.27
И еще


2-1131394631
JBL
2005-11-07 23:17
2005.11.27
количество записей (sql)


14-1131186727
Pazitron_Brain
2005-11-05 13:32
2005.11.27
Что - то с ос.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский