Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 обидится на тебя


Наверх

Титульная страница Поиск, карта сайта Написать письмо