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

Вниз

COM объект и SafeArray   Найти похожие ветки 

 
markers ©   (2011-01-22 10:25) [0]

Доброе утро!
Пишу COM объект, необходимо вернуть многомерный массив, пытаюсь использовать SafeArray, но что-то не получается.  Где-то в нете вычитал что можно использовать VarArray вместо SafeArray, но тоже не работает, вот код на VarArray:
function Tmarkers.m_2gis_GetOrgs: OleVariant;
var
  SArr : Variant;
begin
     SArr := VarArrayCreate([0, 4], varLongWord);
     //SArr[i] := VarArrayOf([org_stable_id, org_name, rub_count, fil_count]);
     Result := SArr;
End;
Взависимости от передаваемого типа данных (varLongWord) появляются разные ошибки, то ошибка создания, то неверный тип.
Есть ли у кого пример заполнение многомерного массива SafeArray (в приоритете) ну или в чём у меня ошибка с VarArray?
Заранее спасибо!


 
Дмитрий Белькевич   (2011-01-22 12:26) [1]


>  необходимо вернуть многомерный массив


Думается мне, что многомерный массив - суть подряд идущие одномерные (насколько я себе представляю, размерность "наружу" не передаётся). Создай одномерный массив нужной размерности m * n и работай поэлементно.

У меня массив OLE строк:


    StudyDesc := VarArrayCreate([0, IBQuery3.Fields.Count - 1], varOleStr);
    for i := 0 to IBQuery3.Fields.Count - 1 do
     StudyDesc[i] := IBQuery3.Fields[i].FieldName + "=" + IBQuery3.Fields[i].AsString;


 
Дмитрий Белькевич   (2011-01-22 12:28) [2]

И, да StudyDesc: OleVariant.

У тебя:


>   SArr : Variant;


 
markers ©   (2011-01-22 13:14) [3]

Спасибо!
Насчёт: StudyDesc: OleVariant. пробовал и так.........

А с SafeArray кто-нибудь что-нибудь подскажет?


 
DiamondShark ©   (2011-01-22 14:46) [4]

Что-то не понятно, что у вас не получается.

Создал File|New|ActiveX Library, File|New|Automation Object


function TTestObject.Method1: OleVariant;
begin
 Result := VarArrayCreate([5, 15, 0, 2], varInteger);
 Result[11, 1] := 123456;
end;


Клиент на Excel VBA

Sub Test()
   Dim q As Object
   Dim a As Variant
   
   Set q = CreateObject("Project1.TestObject")
   a = q.Method1()
   
   Debug.Print IsArray(a)
   Debug.Print LBound(a, 1)
   Debug.Print UBound(a, 1)
   Debug.Print LBound(a, 2)
   Debug.Print UBound(a, 2)
   Debug.Print a(11, 1)
End Sub

Вывод клиента:
True
5
15
0
2
123456

Что не получается? Какая именно ошибка?
Приведите ПОЛНЫЙ код минимального клиента и сервера, в которых воспроизводится ошибка.


> Дмитрий Белькевич   (22.01.11 12:28) [2]
> У тебя:>   SArr : Variant;

А пофигу. Variant и OleVariant иднтичны по физической структуре, совместимы по присваиванию и преобразуются компилятором налету.
Тебя ж не смущает, что
function VarArrayCreate(
 const Bounds: array of Integer;
 VarType: Integer): Variant;

Главное, что Result имеет правильный тип.


 
markers ©   (2011-01-22 20:32) [5]

to DiamondShark
Вообщем задача такая, пишу ком объект (к которому подключается 1С, с этим всё нормально). в ком объекте есть функция которая выполняет некоторые действия и возвращает (в идеале SafeArray ибо я не уверен что 1С будет работать с OleVariant).
SafeArray нужен в 4 колонки.
Код уже привести не могу к сожалению, (переписывал 100 раз, и сейчас вообще убрал).


 
DiamondShark ©   (2011-01-23 11:33) [6]


> (в идеале SafeArray ибо я не уверен что 1С будет работать
> с OleVariant).

Скорее, наоборот.


> Код уже привести не могу к сожалению, (переписывал 100 раз,
>  и сейчас вообще убрал).

Напиши МИНИМАЛЬНЫЙ пример, который будет либо работать, либо давать воспроизводимую ошибку.


 
han_malign   (2011-01-24 13:42) [7]

вообще-то, метод COM всегда должен возвращать HRESULT,
 сеттер и геттер(свойств IDispatch) должны выглядеть немного по другому:
function  TIntfImpl.get_Some(out some: TSomeType): HResult;
function  TIntfImpl.set_Some(some: TSomeType): HResult;

чтобы магия cработала - надо как минимум метод в published помещать(хотя, без Мастера - TLB в Delphi один фиг не сделаешь, MIDL(точнее CORBA) он только экспортировать умеет)...


 
DiamondShark ©   (2011-01-24 18:01) [8]


> han_malign   (24.01.11 13:42) [7]
> вообще-то, метод COM всегда должен возвращать HRESULT,

Вообще-то, есть такая волшебная модель вызова, как safecall.


> чтобы магия cработала - надо как минимум метод в published
> помещать

Щито?


 
han_malign   (2011-01-25 10:46) [9]


> Вообще-то, есть такая волшебная модель вызова, как safecall.

- вот эта магия, видимо и есть ответ на сабж...

> Щито?

- имею право и побредить...



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

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

Наверх




Память: 0.49 MB
Время: 0.01 c
15-1295213390
Юрий
2011-01-17 00:29
2011.05.01
С днем рождения ! 17 января 2011 понедельник


3-1256619451
vovka-x13
2009-10-27 07:57
2011.05.01
Аутентификация в базах данных


2-1295611018
Mops
2011-01-21 14:56
2011.05.01
GET запрос


2-1295623636
Сергей
2011-01-21 18:27
2011.05.01
Как остановить таймер в его событии ontimer?


2-1295719250
Тимоха111
2011-01-22 21:00
2011.05.01
enumwindows меняет переменные