Форум: "Начинающим";
Текущий архив: 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