![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL и динамическая загрузка. [D6, WinXP]
novice_man © (2005-01-28 20:44:00)Почему Windows выдает сообщение о неверной библиотеке:
"Приложение или библиотека С:\MyProject\my_project.dll не является образом для программы Windows NT. Проверьте назначение установочного диска."
Правда "my_project.dll" не является библиотекой, но в данном случае проверял реакцию программы на неверный формат файла (ищу ошибки помаленьку).
function GetDeviceInformation(device_file_name: String): tDeviceINF;
var
fGetDeviceInfo: function: tDeviceINF; stdcall;
hDevice: THandle;
begin
hDevice := 0;
try
hDevice := LoadLibrary(PChar(String(device_file_name))); ***
if hDevice <> 0 then begin
@fGetDeviceInfo := nil;
@fGetDeviceInfo := GetProcAddress(hDevice, 'GetDeviceInfo');
if @fGetDeviceInfo <> nil then begin
Result := fGetDeviceInfo;
end;
end else result.name_lib := '';
finally begin
if hDevice <> 0 then FreeLibrary(hDevice);
end;
end;
*** происходит выход сообщения и программа как ни вчем не бывало продолжает выполняться, происходит проверка
if hDevice <> 0 then begin
end;
а так как hDevice как раз 0 то все.
С "нормальной" библиотекой все нормально выполняется.
novice_man (2005-01-29 18:25:00) [1]Cobalt © (29.01.05 00:09) [5]
Попробуй воспользоваться функцией SetErrorMode
Спасибо за дельную информацию, все получилось как задумано.
novice_man (2005-01-29 07:15:00) [2]ali_tash (28.01.05 22:35) [4]
Это что, найди отличия? Видимо Вы считаете, что этот способ не вызовет exception? Читайте вопрос! :(
Cobalt © (29.01.05 00:09) [5]
Что ж, попробую.
Cobalt (2005-01-29 00:09:00) [3]2 novice_man ©
Попробуй воспользоваться функцией SetErrorMode
ali_tash (2005-01-28 22:35:00) [4]procedure TForm1.BitBtn4Click(Sender: TObject);
var
ShowF1:function:integer;stdcall;
Lib:THandle;
begin
Lib:=LoadLibrary('TimerAli.dll');
if Lib<>0 then
begin
@ShowF1:=GetProcAddress(Lib,'ShowF1');
ShowF1;
end
else
Application.MessageBox('Ошибка загрузки dll','Файл не найден',MB_ICONERROR);
FreeLibrary(Lib);
end;
DrPass (2005-01-28 22:30:00) [5]Потому что ошибка происходит не в твоей программе. Ее выдает Windows при попытке прочесть заголовок библиотеки. LoadLibrary, естественно, вернет 0
novice_man (2005-01-28 22:07:00) [6]DrPass © (28.01.05 21:30) [1]
то есть конструкцияtry ... except (finally)с этого момента утратила свою актуальность?
Почему при работе программы выдается сообщение, даже если ексепшен происходит внутриtry ... except (finally). И еще, не должна ли функцияLoadLibrary, в случае когда библиотека не загружена, вернуть в результате 0 (result <32)?
DrPass (2005-01-28 21:30:00) [7]
> Почему Windows выдает сообщение о неверной библиотеке:
> Правда "my_project.dll" не является библиотекой
Ну так ты же сам ответил на свой вопрос, не так ли?
Библиотеки - это такие же исполняемые файлы, как и exe. При LoadLibrary библиотека загружается в память (если она уже не загружена) и запускается на исполнение. Если ты подсовываешь что-то постороннее, конечно, Windows обидится на тебя