Текущий архив: 2005.02.13;
Скачать: CL | DM;
Вниз
DLL и динамическая загрузка. Найти похожие ветки
← →
novice_man © (2005-01-28 20:44) [0]Почему 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 то все.
С "нормальной" библиотекой все нормально выполняется.
← →
DrPass © (2005-01-28 21:30) [1]
> Почему Windows выдает сообщение о неверной библиотеке:
> Правда "my_project.dll" не является библиотекой
Ну так ты же сам ответил на свой вопрос, не так ли?
Библиотеки - это такие же исполняемые файлы, как и exe. При LoadLibrary библиотека загружается в память (если она уже не загружена) и запускается на исполнение. Если ты подсовываешь что-то постороннее, конечно, Windows обидится на тебя
← →
novice_man © (2005-01-28 22:07) [2]DrPass © (28.01.05 21:30) [1]
то есть конструкцияtry ... except (finally)
с этого момента утратила свою актуальность?
Почему при работе программы выдается сообщение, даже если ексепшен происходит внутриtry ... except (finally)
. И еще, не должна ли функцияLoadLibrary
, в случае когда библиотека не загружена, вернуть в результате 0 (result <32)?
← →
DrPass © (2005-01-28 22:30) [3]Потому что ошибка происходит не в твоей программе. Ее выдает Windows при попытке прочесть заголовок библиотеки. LoadLibrary, естественно, вернет 0
← →
ali_tash (2005-01-28 22:35) [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;
← →
Cobalt © (2005-01-29 00:09) [5]2 novice_man ©
Попробуй воспользоваться функцией SetErrorMode
← →
novice_man © (2005-01-29 07:15) [6]ali_tash (28.01.05 22:35) [4]
Это что, найди отличия? Видимо Вы считаете, что этот способ не вызовет exception? Читайте вопрос! :(
Cobalt © (29.01.05 00:09) [5]
Что ж, попробую.
← →
novice_man © (2005-01-29 18:25) [7]Cobalt © (29.01.05 00:09) [5]
Попробуй воспользоваться функцией SetErrorMode
Спасибо за дельную информацию, все получилось как задумано.
Страницы: 1 вся ветка
Текущий архив: 2005.02.13;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.024 c