Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
2-1295860172
Артём
2011-01-24 12:09
2011.05.01
Склонение женских и мужских фамилий.


15-1295558987
Юрий
2011-01-21 00:29
2011.05.01
С днем рождения ! 21 января 2011 пятница


15-1295242070
KSergey
2011-01-17 08:27
2011.05.01
Проиграть звуковой файл при наличии сигнала с микрофона


2-1296132632
uniken1
2011-01-27 15:50
2011.05.01
передача строки через Indy UDP


2-1296122380
ZV
2011-01-27 12:59
2011.05.01
ServerSocket , напрягает отправка ответа клиенту по номеру конне





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский