powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Несовпадение типов при передаче параметров в OLE компоненту
17 сообщений из 17, страница 1 из 1
Несовпадение типов при передаче параметров в OLE компоненту
    #40046967
ssergio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!
Пытаюсь управлять карточным пинпадом c Arcus2 из Дельфи. Он управляется библиотекой ArcCom.dll
По документации сделал JS код, работает отлично. Там всего 7 строчек:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
                        var termReq =  new ActiveXObject('ArcCom.SAPacketObj.1');
			var termResp =  new ActiveXObject('ArcCom.SAPacketObj.1');
			var ap2 = new ActiveXObject('ArcCom.PCPOSTConnectorObj.1');
			termReq.OperationCode = 1;
			termReq.Amount = 100;
			termReq.CurrencyCode = 643;
			result = ap2.Exchange(termReq, termResp, 15);			



Но, надо в Дельфи. А в ней возникает ошибка "несовпадение типов". Я догадываюсь, что из-за передачи параметра в OLE компоненту по значению, а надо по ссылке. Вообще мануал говорит так: создайте объект Request, объект Response и вызовите метод Exchange, который в Response вернёт результат работы. Выходит, Response надо передать по ссылке.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var res : integer;
    termReq : OleVariant;
    termResp : OleVariant;
    AP2 : OleVariant;
begin
    termReq :=  CreateOleObject('ArcCom.SAPacketObj.1');
    termResp := CreateOleObject('ArcCom.SAPacketObj.1');
    AP2 :=      CreateOleObject('ArcCom.PCPOSTConnectorObj.1');
    termReq.OperationCode := 1;
    termReq.Amount := '100';
    termReq.CurrencyCode := '643';
    res := AP2.Exchange(termReq, termResp, 15);
    ShowMessage(IntToStr(res));
end;




Для похожего оборудования поддержка на код Err=CPT.OleFunction("LinkTest","8300");
отвечала в таком ключе, но без конкретики: "Согласно документации на OLE-компоненту метод LinkTest в качестве аргумента принимает ссылку на строку, в которую OLE-компонента записывает модель терминала. В приведенном фрагменте кода в метод LinkTest передается константная строка".

В самой dll объекты объявлены как интерфейсы.
Код: pascal
1.
2.
3.
4.
 ISAPacketObj = interface(IDispatch)
 SAPacketObj = ISAPacketObj;
 //Метод Exchange такой:  
 function Exchange(var Request: ISAPacketObj; var Response: ISAPacketObj; Timeout: Integer): Integer; safecall;



Но, я то передаю объект. Вроде как он и так передаётся по ссылке?
Как правильно написать?
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40046976
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio
Я догадываюсь, что из-за передачи параметра в OLE компоненту по значению, а надо по ссылке.
Ты не угадал.
Подозреваю что ошибка выскакивает еще тут:
Код: pascal
1.
termReq.Amount := '100';

о чем тебе недвусмысленно сообщают - хотят число а ты даешь строку.
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40046991
ssergio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не-а. Если б было так просто, увы.
Полез в dll проверить параметры:

Код: pascal
1.
2.
3.
4.
ISAPacketObj = interface(IDispatch)
    property CurrencyCode: WideString
    property Amount: WideString
    property OperationCode: Integer 



На termReq.Amount := 100; логично сообщает: Incompatible types WideString and Integer.
В OLE используются строки WideString, а не string.

Теперь ищу как правильно конвертнуть string '100' в widestring.
termReq.Amount := PWideChar(WideString('100')); выдает type not allowed in ole automation call
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40046993
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio,

какая версия Delphi? На какой строчке точно происходит ошибка и ее полный текст?
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40046995
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio
Полез в dll проверить параметры:
А откуда взялась DLL для out-proc COM объекта?
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40046999
ssergio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zelius, версия Дельфи пробовал на обоих. И на 7 и на Studio 10 Seatle.
Ошибка Exception Class EOLESysError message 'Несовпадение типов'
на строке метода Exchange:
res := AP2.Exchange(termReq, termResp, 15);
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047002
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio,
Короче, импортируй библиотеку типов "ArcCom..." и выложи сюда декларацию "TPCPOSTConnectorObj..."
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047005
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio

Для похожего оборудования поддержка на код Err=CPT.OleFunction("LinkTest","8300");
отвечала в таком ключе, но без конкретики: "Согласно документации на OLE-компоненту метод LinkTest в качестве аргумента принимает ссылку на строку, в которую OLE-компонента записывает модель терминала. В приведенном фрагменте кода в метод LinkTest передается константная строка".

В этом случае ошибка из-за того, что в метод вы передавали строку "8300", которая является константой, т.е. не может быть выходным параметром.

По существу вопроса. Пытались приводить OleVariant к нужному интерфейсу?
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047009
ssergio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соколинский Борис
ssergio,
Короче, импортируй библиотеку типов "ArcCom..." и выложи сюда декларацию "TPCPOSTConnectorObj..."


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
TPCPOSTConnectorObj = class(TOleControl)
  private
    FIntf: IPCPOSTConnectorObj;
    function  GetControlInterface: IPCPOSTConnectorObj;
  protected
    procedure CreateControl;
    procedure InitControlData; override;
  public
    function InitResources: Integer;
    procedure FreeResources;
    function SetChanelParam(const IPAddress: WideString; IPPort: Integer; const to_: WideString): Integer;
    function SetProtocolParam(TimeoutAck: Integer; TimeoutPacket: Integer; CountNAK: Integer; 
                              PacketSize: Integer): Integer;
    function Exchange(var Request: ISAPacketObj; var Response: ISAPacketObj; Timeout: Integer): Integer;
    function SetControlServerParam(const IPAddress: WideString; IPPort: Integer; Timeout: Integer): Integer;
    function ControlServerStart: Integer;
    function ControlServerStop: Integer;
    function ReadCardHash(out Last4Digits: WideString; out Hash: WideString; out BIN: WideString): Integer;
    function GetReaderSerialNumber(out serial: WideString): Integer;
    function GetReaderDialogsConfig(out config: WideString): Integer;
    function ReadCardHash2(out Last4Digits: WideString; out Hash: WideString): Integer;
    function ReadCard2(out Digits: WideString): Integer;
    function SignatureCapture(const text: WideString; out Signature: WideString): WordBool;
    function SignatureSetPath(const path: WideString): WordBool;
    function ReadBarcode(out buffer: WideString): Integer;
    property  ControlInterface: IPCPOSTConnectorObj read GetControlInterface;
    property  DefaultInterface: IPCPOSTConnectorObj read GetControlInterface;
  published
    property Anchors;
    property ErrorDescription: WideString index 6 read GetWideStringProp write SetWideStringProp stored False;
    property ErrorCode: Smallint index 7 read GetSmallintProp write SetSmallintProp stored False;
  end;




Меня беспокоит, что в объявлении метода Exchange параметр ISAPacketObj, а я создаю СОМ объекты SAPacketObj.
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047018
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio
Меня беспокоит, что в объявлении метода Exchange параметр ISAPacketObj, а я создаю СОМ объекты SAPacketObj.
Это нормально, OleVariant может IDispatch cодержать, а интерфейс ISAPacketObj от него наследуется.
Смущает var в декларации метода.
Попробуй так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var res : integer;
    termReq, termResp : OleVariant;
    termReqI, termRespI : IDispatch;
    AP2 : OleVariant;
begin
    termReq :=  CreateOleObject('ArcCom.SAPacketObj.1');
    termResp := CreateOleObject('ArcCom.SAPacketObj.1');
    AP2 :=      CreateOleObject('ArcCom.PCPOSTConnectorObj.1');
    termReq.OperationCode := 1;
    termReq.Amount := '100';
    termReq.CurrencyCode := '643';
    timeReqI := TimeReq;
    timeRespI:= TimeResp;

    res := AP2.Exchange(termReqI, termRespI, 15);
    ShowMessage(IntToStr(res));
end;
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047019
ssergio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot goldmi45#22283280]
ssergio

По существу вопроса. Пытались приводить OleVariant к нужному интерфейсу?


В руководстве администратора Arcus написано
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Для работы с Connector рекомендуется следующая последовательность действий:
1. Создать Request экземпляр объекта ISAPacketObj для пересылки данных Server для
проведения транзакции.
2. Создать Response экземпляр объекта ISAPacketObj для получения результатов транзакции
от Server.
3. Создать экземпляр объекта IConnector Obj для организации каналов обмена данными с
Server.
4. Подготовить данные для проведения транзакции, заполнив соответствующие поля в
Request.
5. Послать запрос на проведение транзакции вызовом метода Exchange.



Даёт создать только termResp := CreateOleObject('ArcCom.SAPacketObj');
Ругается на CreateOleObject('ArcCom.ISAPacketObj') : OleSysError недопустимая строка с названием класса.
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047020
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio,

имхо, дело в параметрах, попробуй без строк их передавать, как целое. у тебя используется Dipatch, а там магия. можно попробовать поотлаживать, вдруг ошибка до оле объекта. или использовать интерфейсы напрямую, там прозрачнее
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047025
ssergio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соколинский Борис

Попробуй так:


Заработало! Вы - гений! Огромное спасибо!
Пару очевидных опечаток исправил.

Надо приводить OleVariant к IDispatch? Никогда в жизни б не догадался.
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047039
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio
Надо приводить OleVariant к IDispatch?
В нормальных случаях - нет.
Но тут особый*, ламеру поручили API делать.
* - а может уже и нет.
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047042
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio,

А зачем вам вообще OleVariant? Используйте раннее связывание
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var res : integer;
    termReq, termResp : ISAPacketObj;
    AP2 : IPCPOSTConnectorObj;
begin
    termReq :=  CreateOleObject('ArcCom.SAPacketObj.1') as ISAPacketObj;
    termResp := CreateOleObject('ArcCom.SAPacketObj.1') as ISAPacketObj;
    AP2 :=      CreateOleObject('ArcCom.PCPOSTConnectorObj.1') as IPCPOSTConnectorObj;
    termReq.OperationCode := 1;
    termReq.Amount := '100';
    termReq.CurrencyCode := '643';
    timeReqI := TimeReq;
    timeRespI:= TimeResp;

    res := AP2.Exchange(termReqI, termRespI, 15);
    ShowMessage(IntToStr(res));
end;
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047046
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
А зачем вам вообще OleVariant? Используйте раннее связывание
Да ну нафиг.
Потом эти друзья выпустят patch/обновление в котором добавят метод в интерфейс и "здравствуйте товарищи" (с)
...
Рейтинг: 0 / 0
Несовпадение типов при передаче параметров в OLE компоненту
    #40047053
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssergio,

давным-давно была у меня ситуация примерно как у вас, когда OLE-обьект совершенно непонятно работал и лишь саппорт разработчика подсказал, что я инициализирую какое-то там OleVariant свойство неверным типом данных. Ибо свойство ожидало тип знаковый INTEGER , а я ему передавал беззнаковый DWORD.

Это выражалось таким образом

Я писал что-то типа
Код: pascal
1.
obj.X := 150;




А надо было, что бы компилятор ясно понял, что это INTEGER, так

1) либо
Код: pascal
1.
2.
3.
4.
5.
var
   AnyX : integer;
begin
   AnyX := 150;
   obj.X := AnyX;



2) либо так (я на этом варианте остановился)
Код: pascal
1.
obj.X := integer(150);
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Несовпадение типов при передаче параметров в OLE компоненту
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]