[ОТВЕТИТЬ]
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
Просмотров: 311
Размер:	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)'
07.10.2014 18:26
OlegON
 
DataBufferPointer: OleVariant

The main difference between Variant and OleVariant is that Variant can contain data types that only the current application knows what to do with. OleVariant can only contain the data types defined as compatible with OLE Automation which means that the data types that can be passed between programs or across the network without worrying about whether the other end will know how to handle the data

не в этом ли дело?
07.10.2014 19:51
student
 
Цитата:
alexe6522 Сейчас попробовал DataBufferPointer: char;

var
v: Variant;
RT: Currency;
sh: Smallint;
value1: WideString;
DataBufferPointer: char;
с плюсами практически дела не имел (билдера не имею - проверить не могу), но на обычных сях исходя из описания сделал бы DataBufferPointer: char[n] где n равно количеству байт для чтения и в вызове передал бы указатель на этот массив типа &DataBufferPointer[0] или просто DataBufferPointer - кому как нравится :)
07.10.2014 20:53
alexe6522
 
Цитата:
student с плюсами практически дела не имел (билдера не имею - проверить не могу), но на обычных сях исходя из описания сделал бы DataBufferPointer: char[n] где n равно количеству байт для чтения и в вызове передал бы указатель на этот массив типа &DataBufferPointer[0] или просто DataBufferPointer - кому как нравится :)
Ошибки
First chance exception at $7C812FD3. Exception class EVariantTypeCastError with message 'Could not convert variant of type (OleStr) into type (Boolean)'. Process Project1.exe (3908)
First chance exception at $7C812FD3. Exception class EVariantTypeCastError with message 'Could not convert variant of type (OleStr) into type (Boolean)'. Process Project1.exe (3908)
First chance exception at $7C812FD3. Exception class EOleSysError with message 'Ошибка'. Process Project1.exe (3908)
08.10.2014 08:53
student
 
а разделитель целой и дробной части в системе какой стоит?
Опции темы


Часовой пояс GMT +3, время: 23:56.

 

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