Форум: Техническая поддержка

Тема: Ошибка доступа.

Вы не вошли.

 Поиск | Регистрация | Вход 

Delta_Q
13.04.2018 00:47:45
#1

Гость

Ошибка доступа.

Здравствуйте!
Предисловие:
Меня попросили подкорректировать некоторые моменты в программе написанные не мной, на 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. Способы решения данной проблемы?

13.04.2018 11:10:51
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,478

Re: Ошибка доступа.

1. Какую версию Delphi используете?
2. Как именно объявлена переменная ModuleName?

Delta_Q
14.04.2018 16:48:19
#3

Гость

Re: Ошибка доступа.

1. Какую версию Delphi используете?
     Если верить "dof" файлу то предшественник использовал Delphi 7 версию файла.
     Я перетащил её под среду Embarcadero Delphi XE8.

2. Как именно объявлена переменная ModuleName?

	// название модуля
	ModuleName: PAnsiChar;//String;
16.04.2018 19:04:55
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,478

Re: Ошибка доступа.

К сожалению, у меня нет под рукой Embarcadero Delphi XE8.
Попробуйте задействовать консольный пример, собранный под Delphi 7.

Delta_Q
20.04.2018 19:40:03
#5

Гость

Re: Ошибка доступа.

Собранный "консольный пример", был протестирован.
Тестировал не я, а удалённо человек с Л-Кард E14-440 модулем. (у меня нету Л-Карда, поэтому ответил только сейчас)
Под операционной системой Windows 8.1
Проходит вся инициализация и запускается  сбор данных  Counter 20 from 80
Но на 20 проходе,  Windows 8.1 выпадает в синий экран.

Под операционной системой Windows XP
Программа выполняет всё и записывает файл Test.dat (41.943.040 byte) (весь заполнен D5DF последовательностью)

23.04.2018 14:29:15
#6

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,478

Re: Ошибка доступа.

1. Правильно ли я понимаю, что консольный пример был пересобран под Embarcadero Delphi XE8. И именно этот пример при работе под Windows'8 привёл к появлению BSOD?
2. Убедитесь, что были запользованы самые свежие USB драйвера, которые входят составной частью в библиотеку LComp.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск