Текущий архив: 2003.11.17;
Скачать: CL | DM;
Внизapplication-defined exception Найти похожие ветки
← →
Narayan (2003-11-06 12:31) [0]Вот процедура. Отрабатывает как надо, но на последнем end
вываливается " Project .. faulted with message "application-defined exception (code 0xc000001d) at 0x0012fe19" "
Объясните мне неразумному, в чём дело.
procedure mLoadPlugin(ProviderName: String);
var i: Integer;
mLoad: TmLoad;
begin
i:=Length(vLibHandles);
SetLength(vLibHandles,i+1);
vLibHandles[i]:=LoadLibrary(pChar(ProviderName));
If vLibHandles[i]=0 Then SetLength(vLibHandles,i)
Else
begin
@mLoad:=GetProcAddress(vLibHandles[i],"mLoad");
If ( @mLoad = nil ) Then
begin
FreeLibrary(vLibHandles[i]);
SetLength(vLibHandles,i);
end
Else
begin
mLoad(PLUGINLINK);
@mLoad := nil;
end;
end;
end; // вот тут вываливается
← →
Fiend (2003-11-06 12:33) [1]а покажи ка TmLoad
← →
Narayan (2003-11-06 12:35) [2]
Type PPLUGINLINK = ^TPLUGINLINK;
TPLUGINLINK = record
mGetHandle: TmGetHandle;
mSetEventHook: TmSetEventHook;
mUnHookEvent: TmUnHookEvent;
mAddMenuItem: TmAddMenuItem;
mRemoveMenuItem: TmRemoveMenuItem;
end;
Type TmLoad = procedure (LINK: PPLUGINLINK); stdcall;
← →
Юрий Федоров (2003-11-06 12:37) [3]Скорее его баг в реализации mLoad
← →
Fiend (2003-11-06 12:38) [4]а выделить память под LINK: PPLUGINLINK перед вызовом не надо?
← →
Narayan (2003-11-06 12:42) [5]с етим нормально вроде
procedure mPreparePLUGINLINK();
begin
PLUGINLINK:=AllocMem(SizeOf(TPLUGINLINK));
PLUGINLINK^.mGetHandle:=@mGetHandle;
PLUGINLINK^.mSetEventHook:=@mSetEventHook;
PLUGINLINK^.mUnHookEvent:=@mUnHookEvent;
PLUGINLINK^.mAddMenuItem:=@mAddMenuItem;
PLUGINLINK^.mRemoveMenuItem:=@mRemoveMenuItem;
end;
(вызыватся само сабой раньше)
← →
Юрий Федоров (2003-11-06 12:43) [6]>>Narayan © (06.11.03 12:42) [5]
А память под PPLUGINLINK освобождается где ? В DLL ?
← →
Narayan (2003-11-06 12:48) [7]2 [6] Юрий Федоров © (06.11.03 12:43)
указанная проуедура [5] выполняется один раз.
освобождается в приложении на ОнКлоуз.
← →
Narayan (2003-11-06 12:57) [8]Тут вот какая штука
ищу где надо все dll (FindFirst,FindNext)
и для каждой выполняю mLoadPlugin (см. сабж).
Пока не выделил mLoadPlugin в отдельную процедуру всё работало отлично
(т.е. тело этой процедуры было частью процедуры поиска, причём точ в точ, ничего не менял просто кусок вырезал).
вот так работает
procedure mEnumPlugins;
function IsDotOrTwoDot(Dir: String): Boolean;
begin
Result:=(Dir=".") or (Dir="..");
end;
var mLoad: TmLoad;
ProviderName: String;
i: Integer;
FData: TSearchRec;
begin
If FindFirst((ExtractFilePath(Application.ExeName)+"Plugins\*.dll"),faAnyFile,FData)=0 then
Repeat
If not IsDotOrTwoDot(FData.Name) Then If FData.Size>0 Then
Begin
ProviderName:=ExtractFilePath(Application.ExeName)+"Plugins\"+FData.Name;
i:=Length(vLibHandles);
SetLength(vLibHandles,i+1);
vLibHandles[i]:=LoadLibrary(pChar(ProviderName));
If vLibHandles[i]=0 Then SetLength(vLibHandles,i)
Else begin
@mLoad:=GetProcAddress(vLibHandles[i],"mLoad");
If ( @mLoad = nil ) Then
begin
FreeLibrary(vLibHandles[i]);
SetLength(vLibHandles,i);
end
Else mLoad(PLUGINLINK);
end;
end;
Until FindNext(FData)<>0;
SysUtils.FindClose(FData);
end;
а так нет
procedure mEnumPlugins;
function IsDotOrTwoDot(Dir: String): Boolean;
begin
Result:=(Dir=".") or (Dir="..");
end;
var ProviderName: String;
FData: TSearchRec;
begin
If FindFirst((ExtractFilePath(Application.ExeName)+"Plugins\*.dll"),faAnyFile,FData)=0 then
Repeat
If not IsDotOrTwoDot(FData.Name) Then If FData.Size>0 Then
Begin
ProviderName:=ExtractFilePath(Application.ExeName)+"Plugins\"+FData.Name;
mLoadPlugin(ProviderName);
end;
Until FindNext(FData)<>0;
SysUtils.FindClose(FData);
end;
procedure mLoadPlugin(ProviderName: String);
var i: Integer;
mLoad: TmLoad;
begin
i:=Length(vLibHandles);
SetLength(vLibHandles,i+1);
vLibHandles[i]:=LoadLibrary(pChar(ProviderName));
If vLibHandles[i]=0 Then SetLength(vLibHandles,i)
Else
begin
@mLoad:=GetProcAddress(vLibHandles[i],"mLoad");
If ( @mLoad = nil ) Then
begin
FreeLibrary(vLibHandles[i]);
SetLength(vLibHandles,i);
end
Else
begin
mLoad(PLUGINLINK);
@mLoad := nil;
end;
end;
end;
← →
Юрий Федоров (2003-11-06 13:04) [9]
@mLoad := nil;
Эта строка не нужна.
← →
Narayan (2003-11-06 13:08) [10]2 [9] Юрий Федоров © (06.11.03 13:04)
понимаю, что не нужна.
я её только что добавил, потому как незнаю откуда ошибка.
вот и извращяюсь.
← →
Narayan (2003-11-06 15:32) [11]Господа профессионалы, вопрос всё ещё актуален
Страницы: 1 вся ветка
Текущий архив: 2003.11.17;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c