Форум: "Начинающим";
Текущий архив: 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.015 c