Передать массив в вызов метода com в powerbuilder

Я хочу вызвать метод COM-объекта, который принимает аргумент, представляющий собой массив из PowerBuilder. Этот метод отлично работает с другими контроллерами автоматизации OLE (VB6, VBScript, VBA, Delphi, PHP, чтобы назвать лишь некоторые из них), а в IDL он выглядит так:

    void MyMethod([in, out] SAFEARRAY(VARIANT)* argumentsArray);

Пока мне не удалось вызвать этот метод из PowerBuilder. Я всегда получаю ошибку времени выполнения, похожую на «Недопустимый тип параметра, вызывающий функцию внешнего объекта MyMethod в строке XX в XXXXXX». Насколько я могу судить, эта ошибка генерируется PowerBuilder до вызова моего метода, т.е. это не вид преобразованного HRESULT из самого метода, и метод вообще не вызывается.

У меня нет проблем с вызовом других методов того же COM-объекта из PowerBuilder - тех, которые не используют массивы в качестве аргументов.

Примеры кода PowerBuilder, который я пробовал и который работает с нет:

Any Arguments[]
Arguments[1] = MyArgument
MyObject.MyMethod(Arguments)

Или

OLEObject Arguments[]
Arguments[1] = MyArgument
MyObject.MyMethod(Arguments)

Или

OLEObject Arguments[0 to 0]
Arguments[0] = MyArgument
MyObject.MyMethod(Arguments)

Или

OLEObject Arguments[0 to 0]
Arguments[0] = MyArgument
MyObject.MyMethod(REF Arguments)

Я искал StackOverflow и Интернет и нашел только ответы на противоположную проблему - как передать массивы, являющиеся результатами методов COM, обратно в PowerBuilder.

Как тогда передать массив?

Arguments - это массив OleObjects PowerBuilder или это типы PB? Или это массив OleObject сам? Кроме того, с какой версией PowerBuilder вы работаете?

Frank Alvaro 17.11.2018 15:23

«Arguments» - это массив объектов OLEObject: он уже объявлен таким образом, как вы можете видеть, а «MyArgument» в моих примерах является OLEObject. Я использую PowerBuilder 2017 R3.

ZbynekZ 19.11.2018 10:11

Я возвращаюсь назад, но я считать У меня была похожая проблема много лет назад с PB9. Закончилось тем, что пришлось создать новый метод на OLEObject, который изменял / работал с массивом (добавить / удалить / получить, например: MyObject.AddToArray(MyArgument), MyObject.GetFromArray(0)), а затем полностью отказаться от использования его в качестве аргумента и просто позволить COM-объекту «обрабатывать» метод работает с ним внутри ... Этот подход использовался в наших миграциях PB на протяжении многих лет - сейчас мы на 12.6 - и до сих пор работает. К сожалению, я никогда не возвращался к нему и не знаю, требует ли PB 2017 что-то другое

Frank Alvaro 20.11.2018 13:13

Спасибо. Да, я знаю, что могу обойти это, изменив интерфейс различными способами. Но поскольку я не могу заставить работать только PowerBuilder (компонент работает и должен работать из многих других инструментов), я сделаю это только в крайнем случае. Итак, мой вопрос действительно был о том, можно ли это сделать напрямую в PowerBuilder (и как), без изменения COM-объекта.

ZbynekZ 22.11.2018 08:59
0
4
250
0

Другие вопросы по теме