Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Ошибка EOleSysError при чтении данных из СП402ФР-к : Программирование

27.04.2024 5:02


04.10.2014 21:28
alexe6522
 
Всем привет! Пытаюсь сделать на C++ builder программу взаимодействия ККМ с ПК , не могу понять почему выдается ошибка при попытке чтения данных из памяти.
//Чтение блока данных из памяти ККМ
Variant SP402;
short DataBufferPointer;
SP402.OleFunction("ReadMemBlock", 1, 0, 12, ((Variant*)&DataBufferPointer));
вылетает с ошибкой
Exception class EOleSysError with message 'Ошибка'. Process Project1.exe

Похожая тема: Не выполняется функция ReadMemBlock СП101ФР-К
05.10.2014 08:01
OlegON
 
А те ошибки, которые есть у тебя в коде, и которые перечислены в той теме, уже не ошибки?
05.10.2014 20:02
alexe6522
 
У меня есть пример на Delphi где все работает, но там идет обращение на прямую к dll, а мне нужно через OleFunction
var
s: array[0..12] of char;
begin
SPFR_ReadMemBlock(hfr, arDATA, 0, 12, @s); //@ - обозначает указание на Pointer
Caption := s;
end;

А вот как я делаю через OleFunction

var
v: Variant;
out: Variant;
begin
v.ReadMemBlock(1, 0, 12, out);

и ничего не выходит из этого :(
05.10.2014 20:46
OlegON
 
Для начала определись, что пример и то, что ты хочешь сделать, сходятся лишь форматом передаваемых данных. Почему OLE? Библиотечка зарегистрирована? Больно ошибка невразумительная.
06.10.2014 07:56
alexe6522
 
Код моей программы коментариями буду побписывать что работает.
procedure TFRTest.Button1Click(Sender: TObject);
var
v: Variant;
sh: Smallint;
begin
v := CreateoleObject('SP101FRKLib.SP101FRObject');
v.Connect(1);
v.Init(Now);
v.GetFiscNumber(value1);// Получение заводского номера фискальника работает.
Label1.Caption := value1;
v.GetCurrentShift(sh);// Получение номера текущей смены работает.
Label2.Caption := IntToStr(sh);
v.ReadMemBlock(1, 0, 12, DataBufferPointer);//Получение данных из памяти фискальника не работает вылетает ошибка см. рис.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный1.PNG
Просмотров: 586
Размер:	11.4 Кб
ID:	4062  
06.10.2014 08:14
OlegON
 
А DataBufferPointer кто?
06.10.2014 16:38
alexe6522
 
DataBufferPointer: Variant;
06.10.2014 17:16
student
 
Цитата:
alexe6522 DataBufferPointer: Variant;
м.б. все таки стоит попробовать сначала выделить буфер (не вариант а строка) ?
07.10.2014 18:15
alexe6522
 
Пробовал
DataBufferPointer: String;
DataBufferPointer: integer;
DataBufferPointer: variant;
DataBufferPointer: WideString;
пишет или разрушительный сбой при выполнении данной строки v.ReadMemBlock(1, 0, 24, DataBufferPointer);
или invald argument

Пример функции из файла SP101FRClass.pas
function TSP101FRObject.ReadMemBlock(DataAreaType, ByteOffset, ByteCount: Smallint; DataBufferPointer: OleVariant): Smallint;
var
p: Pointer;
begin
if (DataAreaType < integer(arBIOS)) or (DataAreaType > integer(arRAM)) then begin
Result := SPFRE_INVALID_PARAMETER;
Exit;
end;
p := pointer(integer(DataBufferPointer));
Result := SPFR_ReadMemBlock(hCom, TSPRF_DATA_AREA(DataAreaType), ByteOffset, ByteCount, p);
end;
07.10.2014 18:24
alexe6522
 
Сейчас попробовал DataBufferPointer: char;

var
v: Variant;
RT: Currency;
sh: Smallint;
value1: WideString;
DataBufferPointer: char;
begin
v := CreateoleObject('SP101FRKLib.SP101FRObject');
v.Connect(1);
v.Init(Now);
v.GetFiscNumber(value1);
Caption := value1;
v.GetAccumulatedTotalEx(RT);
Label2.Caption := CurrToStr(RT);
v.GetCurrentShift(sh);
Label1.Caption := IntToStr(sh);
v.ReadMemBlock(1, 0, 24, DataBufferPointer);
v.Disconnect;
end;

Ошибка 'Could not convert variant of type (OleStr) into type (Boolean)'
Часовой пояс GMT +3, время: 05:02.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.