Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
3-56505
Tumcoat
2003-10-28 07:13
2003.11.17
Быстрый поиск по полю типа Date


7-56926
aterm
2003-09-08 11:15
2003.11.17
Hook на передвижение курсоа мыши


3-56451
Belkova
2003-10-30 08:11
2003.11.17
DBLookupComboBox


14-56834
Rauf
2003-10-28 02:06
2003.11.17
создание БД MYSQL на сервере h10.ru???


14-56897
Сатир
2003-10-25 18:14
2003.11.17
Воспроизведение анимированных gif-ов на делфийской форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский