Здравствуйте!
Предисловие:
Меня попросили подкорректировать некоторые моменты в программе написанные не мной, на Delphi.
В программе используется библиотека Lusbaip.dll версии 3.2.
ПО запускается на 64 разрядной ОС Win-8.1
Проблема:
Столкнулся с тем, что в функции Инициализации возникает ошибка:
Access violantion at addres 0037CBFF in module "Lusbaip.dll" Write of addres 006F99CB.
(Адреса, естественно могут меняться)
Фрагмент где происходит ошибка:
Function TLow_Control.Install(var st:string):boolean;
var i:integer;
DllVersion:cardinal;
Str:string;
ddd1,ddd2:smallint;//для теста ППЗУ
pddd:pSHORT;
begin
State.Current_Direction:=_UP;
State.Request_Direction:=State.Current_Direction;
State.Request_Power:=false;
State.Current_Power:=false;
DO_State:=0;
Result:=false;
State.Struct_state:=2;
// сбросим флаги ошибки потока ввода
ReadThreadErrorNumber := 0;
// проверим версию используемой DLL библиотеки
DllVersion := GetDllVersion;
if DllVersion <> CURRENT_VERSION_LUSBAPI then
begin
Showmessage( 'Неверная версия DLL библиотеки Lusbapi.dll! ' + #10#13 +
' Текущая: ' + IntToStr(DllVersion shr 16) + '.' + IntToStr(DllVersion and $FFFF) + '.' +
' Требуется: ' + IntToStr(CURRENT_VERSION_LUSBAPI shr 16) + '.' + IntToStr(CURRENT_VERSION_LUSBAPI and $FFFF) + '.');
Result:=false;
exit;
end;
pModule := CreateLInstance('e440');
if pModule = nil then
begin
//Writeln('Не могу найти интерфейс модуля E14-440!');
Result:=false;
exit;
end;
// попробуем обнаружить модуль E-154 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
for i := 0 to (MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI-1) do if pModule.OpenLDevice(i) then break;
// что-нибудь обнаружили?
if i = MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI then
begin
//Writeln('Не удалось обнаружить модуль E14-440 в первых 127 виртуальных слотах!');
Result:=false;
exit;
end;
// получим идентификатор устройства
ModuleHandle := pModule.GetModuleHandle();
// прочитаем название модуля в текущем виртуальном слоте
ModuleName := '0123456';
if not pModule.GetModuleName(ModuleName) then //------ ERRROR
begin //Writeln('Не могу прочитать название модуля!');
Result:=false;
exit;
end;
// проверим, что это модуль E14-440
if Boolean(AnsiCompareStr(ModuleName, 'E440')) then
begin //Writeln('Обнаруженный модуль не является E14-440!');
Result:=false;
exit;
end;
// попробуем получить скорость работы шины USB
if not pModule.GetUsbSpeed(@UsbSpeed) then
begin //Writeln('Не могу определить скорость работы шины USB');
Result:=false;
exit;
end;
// Код драйвера DSP возьмём из соответствующего ресурса DLL библиотеки Lusbapi.dll
if not pModule.LOAD_MODULE(nil) then
if not pModule.LOAD_MODULE('E440.BIO') then //загрузка своей прошивки
begin //Writeln('Не могу загрузить модуль E14-440!');
Result:=false;
exit;
end;
// проверим загрузку модуля
if not pModule.TEST_MODULE() then
begin //Writeln('Ошибка в загрузке модуля E14-440!');
Result:=false;
exit;
end;
// теперь получим номер версии загруженного драйвера DSP
if not pModule.GET_MODULE_DESCRIPTION(@ModuleDescription) then
begin //Writeln('Не могу получить информацию о модуле!');
Result:=false;
exit;
end;
// получим текущие параметры работы вывода данных
if not pModule.ENABLE_TTL_OUT(true) then
begin //Writeln('Не могу получить текущие параметры вывода данных!');
Result:=false;
exit;
end;
Result:=true;
end;
Точка ошибки:
Ошибка возникает при выполнении функции получения имени:
pModule.GetModuleName(ModuleName)
Вопросы:
1. Можете мне объяснить причину возникновение ошибки?
2. Способы решения данной проблемы?