• Авторизация


Пошаговое выполнение программы в Delphi7 20-12-2006 11:33 к комментариям - к полной версии - понравилось!


Delphi отказывается выполнять пошагово программу, при проходе через breakpoint вешается вмертвую. Кто может высказать предположения с чем это связано? Особенность программы заключается в том, что в ней переопределен метод WndProc главной формы, где я отлавливаю сообщения от своей ловушки (нажатие клавиш в окнах других приложений), может с этим что-то связано?

зы Остальные проги пошагово идут на ура
вверх^ к полной версии понравилось! в evernote
Комментарии (7):
dimaker 20-12-2006-11:35 удалить
))
В колонках играет: Планка - убиваю роботов

LI 5.09.15
ZardoZ 20-12-2006-11:44 удалить
Вешается, если в любом месте брэйкпоинт ставить? Пробовал на другой версии дельфы? У тебя отладчик установлен, который с дельфой ставится?

Интересно было бы посмотреть на это :).
Я делал подобное когда-то, не помню, чтобы у меня такие проблемы были.
aDolphin 20-12-2006-12:00 удалить
Я сейчас нахожусь - на работе

хм.. странно. Может сама делфя глючит?
Покажи текст глючной процедуры.

Тузбубен 20-12-2006-17:44 удалить
Может, компилируешь в Release-конфигурации? Хотя, наверное, тогда должен был бы просто игнорировать брейкпоинты...
Dim_K 21-12-2006-11:32 удалить
Исходное сообщение ZardoZ: Вешается, если в любом месте брэйкпоинт ставить? Пробовал на другой версии дельфы? У тебя отладчик установлен, который с дельфой ставится?

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

Пробовал еще на Turbo Delphi 2006, там, похоже, та же фигня, по крайней мере на первой же строке обработчика OnCreate формы повесился.

Дебагер стандартный из поставки дельфи

Комментирование переопереленной функции WndProc не помогает, видимо не она виновата

LI 5.09.15
ZardoZ 21-12-2006-11:59 удалить
Тогда код в студию.
Dim_K 21-12-2006-22:24 удалить
ZardoZ, нашел кто вешает, но от этого не легче, вешается при установке ловушки, при вызове hook(true, frmMain.Handle); при пошаговом проходе этой строки вешается.
код библиотеки для ловушки

library keyhook;

uses
SysUtils,
Windows,// dialogs,
Messages;

const
MMFName: PChar = 'KeyMMF'; // имя объекта файлового отображения

{структура, поля которой будут отображены в файл подкачки}
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND; // дескриптор установленной ловушки
MyAppWnd: HWND; // дескриптор нашего приложения
end;

var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
WM_MYKEYHOOK: Cardinal;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;

SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, lparam);
CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Result:= 0;
end;

{Процедура установки HOOK-а}
procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
if switch=true then
begin
{Устанавливаю HOOK, если он не установлен (switch=true). }
GlobalData^.SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
GlobalData^.MyAppWnd:= hMainProg;
if GlobalData^.SysHook = 0 then
MessageBox(0, 'Cannot install HOOK!', 'Message from keyhook.dll', 0);
end
else
begin
{Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
if not UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, 'Cannot unistall HOOK', 'Message from keyhook.dll', 0);

end;
end;

procedure OpenGlobalData();
begin
WM_MYKEYHOOK:= RegisterWindowMessage('WM_MYKEYHOOK');
MMFHandle:= CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); // можно так, но лучше: см. след. строку
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0 then
begin
MessageBox(0,'Error: Can''t set hook','Message from keyhook.dll', MB_OK+MB_ICONERROR);
Exit;
end;

{отображаем глобальные данные на АП вызывающего процесса и получаем указатель
на начало выделенного пространства}
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
MessageBox(0, 'Can''t make MapViewOfFile', 'Message from keyhook.dll', 0);
Exit;
end;

end;

procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;

exports hook;

begin
{назначим поцедуру переменной DLLProc}
DLLProc:= @DLLEntryPoint;
{вызываем назначенную процедуру для отражения факта присоединения данной
библиотеки к процессу}
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


Виснет при прохождении строки, если закоментировать, то при прохождении следующего за ней условного оператора

GlobalData^.MyAppWnd:= hMainProg;


LI 5.09.15


Комментарии (7): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Пошаговое выполнение программы в Delphi7 | community_coding - Сообщество программистов | Лента друзей community_coding / Полная версия Добавить в друзья Страницы: раньше»