Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.023 c
1-56595
Марат
2003-11-06 09:32
2003.11.17
Edit


1-56636
rks
2003-11-04 17:59
2003.11.17
Помогите,разобраться с окнами(формами)...


14-56918
Alex134
2003-10-23 22:26
2003.11.17
ищу хостинг для домашней странички


3-56533
a413
2003-10-27 13:25
2003.11.17
BLOB not opened.


4-56965
zagzag
2003-08-05 12:51
2003.11.17
Наложение цветов и прозрачность