Главная страница
    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.47 MB
Время: 0.004 c
3-1256907068
Piter
2009-10-30 15:51
2011.05.01
Есть ли разница, что указывать вместо звездочки в count(*) ?


15-1295007512
Empleado
2011-01-14 15:18
2011.05.01
Неуважение на дорогах


15-1295343778
Knight
2011-01-18 12:42
2011.05.01
Программа regmon+filemon


2-1296220502
Сергей _
2011-01-28 16:15
2011.05.01
Вопрос оптимизации


2-1296036677
И. Павел
2011-01-26 13:11
2011.05.01
Вызов свойства OLEVariant, название которого задано в строке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский