Форум: "Потрепаться";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];
ВнизОтладка DLL Найти похожие ветки
← →
passm (2003-02-11 10:04) [0]Указал Host Application, при команде Run приложение запускается, но на BreakPoint"е в DLL останавливаться не желает :(
DLL загружаю динамически (LoadLibrary)
Кстати, еще синдром, DLL-файл при команде Compile создается, но если его удалить, и сделать Run, то просто запускается Host Application без создания DLL-файла.
Может, кто уже сталкивался.
Help, plz.
← →
stone (2003-02-11 10:14) [1]DLL и Host Application у меня находятся в одной Project Group, и отладка происходит бес проблем.
← →
Digitman (2003-02-11 10:17) [2]
> приложение запускается, но на BreakPoint"е в DLL останавливаться
> не желает
Значит код, на котором брейкпойнт установлен, не вызывается из хост-процесса. Чудес не бывает.
> Кстати, еще синдром
А что в этом удивительного ? Делфи знать не знает ничего о том, что DLL-файл удален тобой. Строить его заново (перед запуском хост-приложения) Делфи будет лишь в том случае, если исх.текст изменен.
← →
passm (2003-02-11 10:32) [3]stone © (11.02.03 10:14)> Пробовал - не помогает :(
Digitman © (11.02.03 10:17)>
> Значит код, на котором брейкпойнт установлен, не вызывается
> из хост-процесса.
В данном случае возможен вызов из др. процесса?
> Чудес не бывает.
Хочется верить :)
>> Кстати, еще синдром
В самом деле. Проверки на существование файла при Run нет. Учту.
← →
Digitman (2003-02-11 10:47) [4]
> В данном случае возможен вызов из др. процесса?
Возможен. Брейкпойнт же ты поймаешь только в том случае, если указанный хост-процесс будет открыт встр.дебагером с привелегиями отладки
← →
Kudatsky (2003-02-11 11:04) [5]У меня такое было, причём из-за глупой ошибки. Dll писалась в одну директорию, а вызывалась из другой...
← →
passm (2003-02-11 11:25) [6]Kudatsky (11.02.03 11:04)> Вроде нет. У всех проектов указал один Output Directory.
Стучу в бубен... :-\
← →
Digitman (2003-02-11 11:31) [7]А в каком состоянии находится опция "Use Debug DCUs" ?
Куда смотрит Debug DCU Path ?
И почему бы не проверить факт заведомо достоверной загрузки хост-процессом трассируемой DLL, установив брейкпойнт, скажем, в DllProc() ? Или - между begin..end в DPR ?
← →
passm (2003-02-11 11:51) [8]Digitman © (11.02.03 11:31)>
> И почему бы не проверить факт заведомо достоверной загрузки
> хост-процессом трассируемой DLL, установив брейкпойнт, скажем,
> в DllProc() ? Или - между begin..end в DPR ?
Между begin..end остановки нет.
> Куда смотрит Debug DCU Path ?
Есть Debug Source Path - пуст.
← →
REA (2003-02-11 12:05) [9]1) Путь к DLL в Project Options должен быть прописан целиком без ./ и ../
2) Отладочная информация включена, а оптимизация выключена
← →
Digitman (2003-02-11 12:08) [10]Покажи исх.код загрузки твоей DLL и код вызова трассируемой ее ф-ции в тексте хост-приложения
Покажи объявление и код трассируемой ф-ции в отлаживаемой DLL
← →
passm (2003-02-11 12:22) [11]Digitman © (11.02.03 12:08)> Ok.
Загрузка DLL и вызов ее методов:
procedure GetData(const ApplicationHandle: HWND;
const PackDescriptionPath: string;
const ToAffiliate: Integer;
const Database: TDatabase);
const
LibraryName = "ExchData.dll";
GetApplicationHandleProc = "GetApplicationHandle";
SetApplicationHandleProc = "SetApplicationHandle";
GetDataProc = "GetData";
type
TGetApplicationHandleMethod = function: HWND; stdcall;
TSetApplicationHandleMethod = procedure(const Handle: HWND); stdcall;
TGetDataMethod = procedure(const DBHandle: HDBIDB;
const PackDescriptionPath: PChar; const ToAffiliate: Integer); stdcall;
var
Hl: THandle;
Ha: HWND;
GetApplicationHandleMethod: TGetApplicationHandleMethod;
SetApplicationHandleMethod: TSetApplicationHandleMethod;
GetDataMethod: TGetDataMethod;
begin
Hl:= LoadLibrary(LibraryName);
if Hl <> 0 then
begin
GetApplicationHandleMethod:= GetProcAddress(Hl, GetApplicationHandleProc);
SetApplicationHandleMethod:= GetProcAddress(Hl, SetApplicationHandleProc);
GetDataMethod:= GetProcAddress(Hl, GetDataProc);
Ha:= 0;
try
if Assigned(GetApplicationHandleMethod) then
Ha:= GetApplicationHandleMethod;
if Assigned(SetApplicationHandleMethod) then
SetApplicationHandleMethod(ApplicationHandle);
if Assigned(GetDataMethod) then
GetDataMethod(Database.Handle, PChar(PackDescriptionPath), ToAffiliate)
finally
try
if Assigned(SetApplicationHandleMethod) then
SetApplicationHandleMethod(Ha)
finally
FreeLibrary(Hl)
end
end
end
end;
DLL привести полностью не могу - кода много.
library ExchData;
uses
SysUtils,
Classes,
FileUtil,
DataExch in "DataExch.pas",
DatMod in "DatMod.pas" {dm: TDataModule},
SendData in "SendData.pas" {SendDataForm},
BDE,
DB,
Forms,
Windows,
SendDataTh in "SendDataTh.pas",
GetData in "GetData.pas" {GetDataForm},
LogMemo in "LogMemo.pas" {LogMemoForm},
GetDataThread in "GetDataThread.pas",
PacksConst in "PacksConst.pas",
PackApi_h in "PackApi_h.pas",
Defs in "..\Manager_1\Defs.pas",
AddedFuncs in "..\Manager_1\AddedFuncs.pas";
function GetApplicationHandle: HWND; stdcall;
begin
Result:= Application.Handle
end;
procedure SetApplicationHandle(const Handle: HWND); stdcall;
begin
Application.Handle:= Handle
end;
procedure SetParam(const ParamName: PChar; const Field: TField); stdcall;
begin
DataExch.SetParam(string(ParamName), Field)
end;
procedure SendData(const DBHandle: HDBIDB; const PackFileName: PChar; const ToAffiliate: Integer); stdcall;
begin
if FileExists(string(PackFileName)) then
begin
dm:= Tdm.Create(nil);
dm.Database1.Handle:= DBHandle;
try
DataExch.SendData(string(PackFileName), ToAffiliate)
finally
dm.Free;
dm:= nil
end
end else
MessageBox(Application.Handle, PChar("Path not found " + string(PackFileName)), "Error",
MB_ICONERROR + MB_OK)
end;
procedure GetData(const DBHandle: HDBIDB; const GetDataPath: PChar; const ToAffiliate: Integer;
const PackDescriptionPath); stdcall;
begin
if DirExists(string(GetDataPath)) then
begin
dm:= Tdm.Create(nil);
dm.Database1.Handle:= DBHandle;
try
DataExch.GetData(string(GetDataPath), ToAffiliate)
finally
dm.Free;
dm:= nil
end
end else
MessageBox(Application.Handle, PChar("Path not found " + string(GetDataPath)), "Error",
MB_ICONERROR + MB_OK)
end;
exports
GetApplicationHandle index 1,
SetApplicationHandle index 2,
SetParam index 3,
SendData index 4,
ExchData.GetData index 5;
begin
end.
Но, в принципе функции в DLL можно сделать пустыми. В данном случае не важно что они делают.
PS: <Digitman © > Огромное спасибо за внимание.
← →
Digitman (2003-02-11 12:36) [12]1. Хост-приложение - многопоточное ? В каких код.потоках в хост-процессе вызывается процедура GetData() ?
2. Покажи, где ставишь точки останова
← →
passm (2003-02-11 12:44) [13]Digitman © (11.02.03 12:36)> Нет. Хост-приложение не многопоточное. Точнее процедура вызова функции DLL не вызывается из отдельного потока.
Точку остановки ставлю на if DirExists...
IMHO, скорее всего надо копать где-то в настройках.
← →
Digitman (2003-02-11 13:02) [14]далеко ты полез, однако)
начни с простейшей проверки
library ExchData;
...
begin
//если библиотека корректно загружена и инициализирована при
//вызове LoadLibrary() в хост-процессе, то следующая строчка
ShowMessage("DLL loaded & initialized"); // <-- здесь поставь BP
//должна безусловно получить управление еще ДО вызова любой из
//ф-ций этой библиотеки
end.
← →
passm (2003-02-11 13:11) [15]Digitman © (11.02.03 13:02)> Вызывается, но не останавливается.
← →
Digitman (2003-02-11 13:16) [16]все же немаловероятно, что существует более одного экз-ра DLL...
← →
passm (2003-02-11 13:25) [17]Digitman © (11.02.03 13:16)> Это я уже проверял.
← →
Digitman (2003-02-11 13:30) [18]Опция Integrated Debugging включена ?
С какими опциями отладки собран DLL-проект ?
← →
passm (2003-02-11 13:35) [19]Digitman © (11.02.03 13:30)>
> Опция Integrated Debugging включена ?
Да
> С какими опциями отладки собран DLL-проект ?
Debug Information, Local Symbols, Reference Info, Assertions.
← →
Юрий Зотов (2003-02-11 13:38) [20]Система - XP? Под ней такое чудо действительно случается, это известная проблема. По непонятной причине отладчик не подгружает таблицу символов DLL.
Сразу после LoadLibrary напишите какой-нибудь MessageBox, чтобы тормознуть программу. Когда диалог вывалится, переключитесь в Delphi и нажмите Ctrl+Alt+M - откроется список загруженных модулей. Найдите свою DLL, щелкните по ней правой кнопкой, выберите Reload Symbol Table и загрузите таблицу. После этого брейкпойнты в DLL заработают, осталось только вернуться в программу и в диалоге нажать ОК, чтобы продолжить ее работу.
← →
Digitman (2003-02-11 13:41) [21]Если для отладки выполнить Attach to Host Process для предварительно уже запущенного "вручную" хост-приложения - та же картина ?
← →
Юрий Зотов (2003-02-11 13:55) [22]> Digitman © (11.02.03 13:41)
Точно уже не помню, кажется, да. Я столкнулся с этим несколько месяцев назад, полазил по конференциям (кстати, здесь дали ссылку, спасибо) и прочитал, в чем дело. Поскольку грузить таблицу ручками при каждом старте было лень, сначала написал очень простой эксперт IDE (создает невидимое окно, программа с опцией DEBUG после LoadLibrary вызывает SendMessage и передает имя DLL, а эксперт, получив сообщение, загружает таблицу). Но потом все же снес XP и вернулся к 2K.
← →
Digitman (2003-02-11 14:10) [23]
> Юрий Зотов
По поводу XP - ничего не могу сказать, не работал с ХРенью)..
Но здесь еще, кстити, и Д4 фигурирует - в этой версии тоже багов немало... вероятно, и со встроенным дебагером проблемы имеются..
Да, наверно, следует посоветовать автору отказаться от такой комбинации в пользу Винтукея + Делфи (версии не ниже 5.x)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c