Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1106189687
Думкин
2005-01-20 05:54
2005.02.13
С Днем Рождения! 20 января


1-1106988127
Zuborob
2005-01-29 11:42
2005.02.13
Корни N-ной степени и возведение в N-степень


9-1098710056
Zeqfreed
2004-10-25 17:14
2005.02.13
Полноэкранность в OpenGL


14-1106315451
syte_ser78
2005-01-21 16:50
2005.02.13
блин, нужен отдых.


3-1105940362
mea
2005-01-17 08:39
2005.02.13
MySQL - как узнать права пользователя?