Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.06;
Скачать: CL | DM;

Вниз

OPC + Delphi + SafeArray =???   Найти похожие ветки 

 
a_k_v   (2002-01-22 08:36) [0]

я импортировал библиотеку типов из OPC сервера.
простые иетоды из библиотеки не требующие
параметров, или с параметрами WideString, Integer и т. д.
вызываются без проблем, а методы требующие в качестве параметров
PSafeArray выдают ошибку "The parameter is incorrect"

Отсюда вопрос: возможно ли в принципе из Delphi через OLE и OPC
передавать в качестве параметров массивы SafeArray, если да то как.

P.S.: В VB в качестве этих параметров для OPC сервера передаются динамические массивы:
Dim A() as String;
Dim B() as Integer;
и т.д.


 
Digitman   (2002-01-22 11:00) [1]

создай переменную типа SafeArray, заполни массив, контролируемый этой переменной, значениями и передай указатель на переменную (приведенный к типу PSafeArray) в кач-ве параметра интефейсного вызова


 
handra   (2002-01-22 11:01) [2]

пример:

ByteData: Variant;
ByteArr: PByteArr;
P: Pointer;
n: Integer;

//вызов функции с сылкой на SafeArray - ByteData
IGeoMap.LoadObjectData(0,0,VarArrayRef(ByteData));
//определяем размер в байтах
n := VarArrayHighBound(ByteData,1)-VarArrayLowBound(ByteData,1)+1;
//Выделяем память для данных и копируем их
P := VarArrayLock(ByteData);
GetMem(ByteArr,n);
Move(P^,ByteArr^,n);
VarArrayUnLock(ByteData);
//Освобождаем ресурс
ByteData := NULL;


Все это уже год стабильно работает.


 
a_k_v   (2002-01-23 05:33) [3]

to handra
Вызов с VarArrayRef не компилируется ругается, что параметр
не тот.

вот описание функции из библиотеки типов:
procedure AddItems(NumItems: Integer;
var ItemIDs: SafeArray;
var ClientHandles: PSafeArray;
out ServerHandles: PSafeArray;
out Errors: PSafeArray; RequestedDataTypes: OleVariant;
AccessPaths: OleVariant); safecall;

var
NumItems: Integer;
ItemsIDs, ClientHandles,..., : Variant;
begin
...
// Вот так создаю массивы
ItemsIDs := VarArrayCreate([1,10]), varVariant);
ClientHandles := VarArrayCreate([1,10]), varVariant);
// Заполняю как всегда
ItemsIDs[i] := ...
// а вот так пытаюсь вызвать функцию

ItemCollection.AddItems(NumItems,
PSafeArray(TVarData(ItemsIds).Varray) ,
PSafeArray(TVarData(ClientHandles).Varray),
PSafeArray(TVarData(ServerHandles).Varray),
PSafeArray(TVarData(Errors).Varray),
ReqDataTypes, sAccPath);
и на этапе выполнения получаю "The parameter is incorrect"
то же и при попытке задать вместо varVariant конкретные типы.
???





...


 
a_k_v   (2002-01-23 05:36) [4]

to Digitman
>> создай переменную типа SafeArray, заполни массив,...
нет ли у вас примера реализации?


 
Digitman   (2002-01-23 12:08) [5]

посмотри пример реализации методов

TDataBlockInterpreter.WriteArray()
TDataBlockInterpreter.ReadArray()

в модуле SConnect.

эти методы задействуют механизмы передачи вариантных массивов по стандартным OLE-соглашениям в части маршаллинга интерфейсных вызовов с SafeArray-параметрами


 
Yuri Dubrov   (2002-03-02 00:40) [6]

Вот как я получал список источников данных ODBС с помощью функции GetDataSourceList (из библиотеки ODBCTool.dll). Эта функция создает внутри себя SafeArray и возвращает ссылку на него. Ссылка - типа PSafeArray. Как ею воспользоваться?

Надо создать переменную типа Variant. В моем примере это переменная a. На самом деле, Variant внутри является структурой типа TVarData. В поля этой структуры записываем:

- Тип вариантной переменной:
TVarData(a).VType := varOleStr + varArray;

- Полученную ссылку на массив:
TVarData(a).VArray := PVarArray(plst);

Дальше можно спокойно работать с вариантной переменной.

Вот работающий пример:



uses
ODBCTool_TLB, ActiveX

{...}

procedure TForm1.ODBCDSNComboBoxDropDown(Sender: TObject);
var
ds: DSN;
plst: PSafeArray;
a: Variant;
i: integer;
t: integer;
begin
ODBCDSNComboBox.Items.Clear;

{получим список DSN}
ds := CoDsn.Create;
ds.GetDataSourceList(plst);

{"обернем" его в вариантный массив}
TVarData(a).VArray := PVarArray(plst);
TVarData(a).VType := varOleStr + varArray;

{теперь используем}
for i:= VarArrayLowBound(a,1) to VarArrayHighBound(a,1) do
ODBCDSNComboBox.Items.Add(VarToStr(a[i]));

ds := nil;

end;




Страницы: 1 вся ветка

Текущий архив: 2002.05.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-17624
Axenow
2002-04-21 12:41
2002.05.06
Помогите расположить текст вертикально.


1-17565
al45
2002-04-22 11:01
2002.05.06
Ошибка при работе с Word2000


1-17578
Чужой
2002-04-22 14:03
2002.05.06
Реестр


14-17704
savva
2002-03-28 10:11
2002.05.06
Не знаю куда вопрос задавать, попробую здесь.


4-17732
a_k_v
2002-01-22 08:36
2002.05.06
OPC + Delphi + SafeArray =???