Проблема с COMSafeArray!
От: GYlgamesh  
Дата: 30.10.12 07:27
Оценка:
Юзаю embarcadero delphi xe3
вот собственно код:

unit COMSafeArray;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ActiveX, StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  DDSCSArrayBound: array[0..0] of TSafeArrayBound;//^SAFEARRAYBOUND;
  DDSCSArray: PSafeArray;//array of Variant;//
  DDServerID: TGUID;//OleVariant;//THandle;
  DDServer: OleVariant;//THandle;
  DDServerConnected: boolean;
  ErrorDDServer: integer;
  ErrorDDServerText: string;

begin
  if DDServerConnected = False then begin
    DDServer := CreateOleObject('DSCom.DSComObj');
    ErrorDDServer := 13;
    DDServerConnected := True;
    ErrorDDServer := DDServer.DDSInit('pos375-b98','9750','rarus');
  end;
  if DDServerConnected = True then begin
    if ErrorDDServer = 0 then begin
      ErrorDDServerText := '';
      DDSCSArrayBound[0].cElements := 1;
      DDSCSArrayBound[0].lLbound := 0;
      DDSCSArray := SafeArrayCreate(VT_ARRAY,1,DDSCSArrayBound);
      while ErrorDDServer <> 1111 do begin
        ErrorDDServer := DDServer.DDSExecute('GetVersion',DDSCSArray,ErrorDDServerText);
      end;
      ShowMessage('Депозитный сервер подключен: ' + IntToStr(ErrorDDServer));
    end;
  end;
end;

end.


описание компоненты:

Синтаксис:
DDSInit (Parameters: IPaddress, Port : string, Password: string): Integer
Описание:
Запускает отдельный фоновый процесс контроля соединения с депозитно-дисконтным сервером
Параметры:
IPaddress – строка, входной параметр содержащий имя компьютера или IP-адрес, где запущен депозитно дисконтный сервис. Примеры: “SERVER123” или “172.16.1.101”
Port – строка, входной параметр, содержащий номер TCP-порта, на котором принимает входящие запросы депозитно-дисконтный сервер. (По умолчанию “9750”)
Password – строка, с паролем подключения к серверу.
Примечание: если пароль указан неверно, то этот метод не возвращает ошибку. Вместо этого ошибку 142 будет возвращать метод DDSExecute при любом своем вызове.
Возвращаемое значение:
0 – метод выполнен успешно, иначе – код ошибки (см. раздел 4 данного документа)

Внимание! Возврат нулевого значения означает лишь успешный запуск фонового процесса, а не факт успешной установки соединения с депозитно-дисконтным сервером. Реальная установка соединения может произойти позднее (через несколько секунд), поэтому данный метод следует вызывать заранее (например, при запуске/инициализации программы), за некоторое время до первых попыток взаимодействия с депозитно-дисконтным сервером (см. описание DDSExecute)
-------------------------------------
Синтаксис:
DDSExecute (MethodName: string; var Params: OleVariant; var oResDescription: String): Integer
Описание:
Запрашивает выполнение метода депозитно-дисконтного сервера и возвращает результаты его исполнения.
Параметры:
MethodName – строка, входной параметр, содержащий любое имя метода депозитного сервера из раздела 3 данного документа. Например “GetVersion”

Params – COMsafeArray структура, при вызове должна содержать входные параметры вызываемого метода согласно его описанию (см. гл 3 данного документа).
При успешном исполнении метода, в данном параметре содержится COMsafeArray структура с возвратными параметрами метода согласно его описанию (см. гл 3 данного документа)

oResDescription – строка, возвратный параметр. Содержит текстовое описание результата обращения к депозитно-дисконтному серверу.

Возвращаемое значение:
0 – метод выполнен успешно, иначе – код ошибки (см. раздел 4 данного документа)

--------------------------------------
Синтаксис:
GetVersion (Parameters: SafeArray): Integer
Описание:
Получение версии сервера.
Параметры:
Parameters: SafeArray (входной)
Не используется.
Parameters: SafeArray (выходной)
Используется. Описание ниже.
Возвращаемое значение:
0 – метод выполнен успешно, иначе – код ошибки
Массив Parameters (выходной)

SafeArray
Индекс Имя Тип Описание
0 Version Строка Версия сервера. Например «1.1.0»


Есть пример на 1С:
ОбъектСвязиССервером = Новый COMОбъект("DSCom.DSComObj");
Если КодОшибки <> 0 Тогда
Сообщить(“Объект взаимодействия с депозитным сервером вернул ошибку с кодом: ” + КодОшибки);
Возврат;
КонецЕсли;
ТекстОшибки = ””; // Сюда получим текст ошибки

// Создадим SafeArray для передачи параметров
SafeArrayПараметры = Новый COMSafeArray("VT_VARIANT", 1); // один параметр у GetVesion

// Вызываем…
Повторять
КодОшибки = ОбъектСвязиССервером.DDSExecute("GetVersion", SafeArrayПараметры, ТекстОшибки);
Пока КодОшибки<>1111 Конец; // код 1111 – это связь с сервером в процессе установления, нужно подождать до успешного результата или до ошибки


Пытаюсь реализовать на Delphi и получаю постоянно ошибку:
[DCC Error] COMSafeArray.pas(50): E2160 Type not allowed in OLE Automation call строка где
ErrorDDServer := DDServer.DDSExecute('GetVersion',DDSCSArray,ErrorDDServerText);

Вообщем нид хелп.... Бодаюсь второй день что не так делаю понять не могу.
Re: Проблема с COMSafeArray!
От: Vi2 Удмуртия http://www.adem.ru
Дата: 30.10.12 11:57
Оценка:
Здравствуйте, GYlgamesh, Вы писали:

GY> DDSCSArray := SafeArrayCreate(VT_ARRAY,1,DDSCSArrayBound);


GY>SafeArrayПараметры = Новый COMSafeArray("VT_VARIANT", 1); // один параметр у GetVesion


Вот в этом и разница.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Проблема с COMSafeArray!
От: GYlgamesh  
Дата: 31.10.12 07:25
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, GYlgamesh, Вы писали:


GY>> DDSCSArray := SafeArrayCreate(VT_ARRAY,1,DDSCSArrayBound);


GY>>SafeArrayПараметры = Новый COMSafeArray("VT_VARIANT", 1); // один параметр у GetVesion


Vi2>Вот в этом и разница.


В общем...


var
  DDSCSArray: Variant;
.
.
.
.
.
begin
 DDSCSArray := VarArrayCreate([0, 1], VT_VARIANT);
.
.
.
.
end.

Вот и все решение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.