![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL
tp © (2004-08-20 11:58:00)Всем здравствуйте! Написал DLL. Статически работает без проблем, а при динамическом вызове FeeeLibrary выдает исключение:Project C:\Project\MyProject.exe raised too many consecutive exceptions:
'access violation at 0x00000000: read of address 0x00000000:'. В exe-шнике убрал все вызовы функциий, оставил только загрузку и выгрузку. Где мои грабли.
Digitman (2004-08-20 15:24:00) [1]
> tp (20.08.04 15:20) [23]
то что ты вешаешь лапшу на уши, упрямо приводя здесь код, заведомо не соответствующий вызывающему проблему, было ясно изначально
tp (2004-08-20 15:20:00) [2]Проблема нашлась: Заремив все, что можно, потерял ShareMem.
Извините, что отнял массу времени. Спасибо всем.
Digitman (2004-08-20 15:07:00) [3]
> Там переменные
где "там" ? в предложенном коде никаких новых переменных по отн. к твоему коду нет !
> просто не выполняется
и не ожидалось, а это тоже немаловажная инф-ция
...
итак , ты утверждаешь, что попытка выгрузки заведомо гарантированно загруженной "абсолютно пустой" библиотеки
library Project1;
begin
end.
приводит вот к таким плачевным результатам ? да или нет ?
tp (2004-08-20 14:54:00) [4]
> ну как угодно
> значит так в помощи нуждаешься !
Там переменные и т.п., которые не относятся к DLL.
> мне это пока абсолютно ни о чем не говорит, я хочу увидеть
> результаты работы именно того кода, что я предложил исполнить
> на твоей машине, а не какие-то досужие домыслы
А я и написал
> H > 0 @Deini <> nil @Ini <> nil
> FreeLibrary(H)вообще не заканчивается. После довольно-таки
> длительного раздумья вылетает окно CPU и exceptions, и так
> до бесконечности пока не оборвешь по Ctrl+F2
т. е.
> on e:exception do
> ShowMessage(e.classname + ' ' + e.message);
просто не выполняется.
Digitman (2004-08-20 14:42:00) [5]
> tp (20.08.04 14:34) [18]
> Просто не хотелось переписывать FormCreate и FormDestrroy
ну как угодно
значит так в помощи нуждаешься !
> Хочу напомнть, что при статической загрузке все работает
> нормально
мне это пока абсолютно ни о чем не говорит, я хочу увидеть результаты работы именно того кода, что япредложил исполнить на твоей машине, а не какие-то досужие домыслы
tp (2004-08-20 14:36:00) [6]Хочу напомнть, что при статической загрузке все работает нормально.
tp (2004-08-20 14:34:00) [7]H > 0 @Deini <> nil @Ini <> nil
Просто не хотелось переписывать FormCreate и FormDestrroy.
FreeLibrary(H)вообще не заканчивается. После довольно-таки длительного раздумья вылетает окно CPU и exceptions, и так до бесконечности пока не оборвешь по Ctrl+F2
Digitman (2004-08-20 14:17:00) [8]выполни этот код, о результатах увиденных сообщений на экране и последовательности их возникновения доложишь с точностью до буквы
var
Ini: TIni;
Deini: TDeini;
H: THandle;
procedure TForm1.FormCreate(Sender: TObject);
begin
H := LoadLibrary('cardp.dll');
if H > 0 then
begin
Ini := GetProcAddress(H, 'Ini');
if @Ini = nil then
ShowMessage(SysErrorMessage(GetLastError));
Deini := GetProcAddress(H, 'Deini');
if @Deini = nil then
ShowMessage(SysErrorMessage(GetLastError));
end
else
ShowMessage(SysErrorMessage(GetLastError));
...
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if H > 0 then
try
if not FreeLibrary(H) then
ShowMessage(SysErrorMessage(GetLastError));
except
on e:exception do
ShowMessage(e.classname + ' ' + e.message);
end;
end;
Суслик (2004-08-20 14:16:00) [9]надо бы после всех вызовов api функций проверять результаты - при ошибках они исключения не генерят
Goffman (2004-08-20 14:14:00) [10]Может он библиотеку найти не может
tp (2004-08-20 14:06:00) [11]...
try
TIni = procedure;
TDeini = procedure;
...
var
Ini: TIni;
Deini: TDeini;
H: THandle;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
H := LoadLibrary('cardp.dll');
@Ini := GetProcAddress(H, 'Ini');
@Deini := GetProcAddress(H, 'Deini');
Ini;
...
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Deini;
FreeLibrary(H);
end;
Digitman (2004-08-20 13:43:00) [12]так, стоп ..
ты хочешь сказать, что текст проекта вот в таком виде
library Project1;
uses
SysUtils,
Classes;
{$R *.res}
begin
end;
вызывает ту же ошибку при дин.загрузке ?
тогда приводи код из ехе-проекта : где и как ты производишь дин.загрузку
Digitman (2004-08-20 13:39:00) [13]
> tp (20.08.04 13:28) [11]
нет, ты точно русский язык не понимаешь)
диктую большими буквами : приведи сюда для анализа полный текст модуля frmMain.pas!
tp (2004-08-20 13:28:00) [14]library Project1;
uses
SysUtils,
Classes{,
Forms,
frmMain in 'frmMain.pas' {MainForm}};
{$R *.res}
{procedure Ini;
begin
MainForm:= TMainForm.Create(nil);
end;
procedure Deini;
begin
MainForm.Free;
end;
exports
Ini,
Deini;
}
begin
end;
Увы...
Digitman (2004-08-20 13:10:00) [15]
> tp (20.08.04 13:05) [9]
ты русский язык понимаешь ? анализ источника ошибки ведет в модуль, в котором описана форма (неважно, создается она или нет !) !
tp (2004-08-20 13:05:00) [16]
> Digitman © (20.08.04 12:56) [7]
В exe-шнике убрал все вызовы функциий(Ini, Deini), оставил только загрузку и выгрузку. Форма не создается.
Smithson (2004-08-20 12:56:00) [17]Иди в поиск, форма в DLL тема называлась, кажется.
Digitman (2004-08-20 12:56:00) [18]
> tp (20.08.04 12:51) [5]
ошибка - в frmMain.pas
Мастер (2004-08-20 12:54:00) [19]Супер!
tp (2004-08-20 12:51:00) [20]library Project1;
uses
SysUtils,
Classes,
Forms,
frmMain in 'frmMain.pas' {MainForm};
{$R *.res}
procedure Ini;
begin
MainForm:= TMainForm.Create(nil);
end;
procedure Deini;
begin
MainForm.Free;
end;
exports
Ini,
Deini;
begin
end;