Консультация № 153535
08.12.2008, 22:38
0.00 руб.
0 6 1
Здравствуйте господа эксперты. Возникла необходимость, в момент запуска своей программы, отловить сообщение типа "не найдена такая-та DLL, переустановка программы поможет исправить эту проблему", нужно для того чтобы запустить программу инсталятор. Не найду никак решение этой проблемы. Буду рад Вашей помощи.

Обсуждение

Неизвестный
09.12.2008, 10:17
общий
это ответ
Здравствуйте, Genia007!

А вот тут как раз проявляется разница между статическим связыванием с DLL и динамическим. В первом случае система при старте проверяет все линки с DLL-ками и если какой-то нет то, то показывает такое сообщение - отловить его не получиться - ваш код еще не исполняется. Чтобы корректно работать в такой ситуации надо использовать динамическое связывание, используя LoadLibrary (загрузка DLL - если нет то хэндл < 32 и можно корректно выдать сообщение) и GetProcAddress (для доступа к конкретной функции). В приложении пример динамического связывания.

Приложение:
var
hInstDll : THandle = 0;
var
EnumProcesses : function (lpidProcess : PDWORD; cb : DWORD; var cbNeeded : DWORD) : BOOL; stdcall;

hInstDll := LoadLibrary(PChar('PSAPI.DLL'));
if hInstDll > 32 then EnumProcesses := GetProcAddress(hInstDLL,'EnumProcesses');
давно
Профессионал
153662
1070
09.12.2008, 22:02
общий
Я использую драйвер управления LPT портом TVicPort. Дело в том, что DLL вызывает не мой модуль, а модуль управления TVicPort и с какого места я не могу найти, знаю только место нахождения этой DLL. Она должна устанавливаться в C:\WINDOWS\system\TVicPort.dll. А к проекту подключается модуль VicPort, который ссылается на PortLib, а он на внешнюю библиотеку. Вот я и запутался. Перебрал все мне известные директивы компилятора, не подходят. При компиляции и старте проекта и вылетает ошибка на строке begin главного модуля проекта.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
09.12.2008, 22:21
общий
Провёл такой эксперимент: скопировал эту библиотеку в папку с программой, и программа запустилась, вот я и думаю, а зачем инсталятор драйвера копирует эту библиотеку TVicPort.dll именно по адресу C:\WINDOWS\system, а фаил TVicPort.sys в C:\WINDOWS\system32\drivers. Выходит линки в модуле не жёстко привязаны к месту.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
10.12.2008, 01:35
общий
Да к месту не привязаны - по правилам при поиске используются: тот же каталог, потом системные каталоги и пути указанные в переменной PATH, если не ошибаюсь. При этом порядок просмотра (для случая если есть одинаковые DLL по разным путям) строго определен - где-то в MSDN было - можно проверить.

В вашем случае надо грузить динамически модуль c TVicPort/PortLib (это компонент? или что-то другое кстати), если нет исходников, то можно вынести в отдельную свою DLL и грузить ее динамически, перед этим проверив доступность нужной DLL через LoadLibrary (TVicPort.dll). Если же есть доступ к исходникам модуля, то переделать связывание с TVicPort.dll в нем на динамическое.

И к динамическим sys-драйверам кажется это тоже относится, так что можете и его в свой каталог попробовать положить.
давно
Профессионал
153662
1070
10.12.2008, 13:03
общий
TVicPort это библиотека TVicPort.dll и драйвер TVicPort.sys для работы с портами, для разных языков программирования. К проекту подключается только модуль VicPort.pas. Вот здесь архив с ним. Насчёт поиска вы правы первый проверяется каталог с программой. Думаю положу эту библиотеку в каталог с программой и во время запуска буду проверять находится ли драйвер TVicPort.sys на месте в каталоге C:\WINDOWS\system32\drivers, чтобы не рисковать с драйвером. Завтра приду на работу и по экспериментирую с прогой и исходниками VicPort, PortLib.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
10.12.2008, 14:42
общий
Тогда еще и версию драйвера проверяйте, а то окажется ваша библиотека от другой версии драйвера - можете огрести массу проблем :).
Форма ответа