[ОТВЕТИТЬ]
Опции темы
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)'
 
 


Опции темы



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

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