Что Matlab эквивалентен из ПУСТОГО УКАЗАТЕЛЯ, когда он называет методы COM/ActiveX?

Я поддерживаю программу, которая может быть автоматизирована через COM. Обычно клиенты используют VBS, чтобы сделать их сценарии, но у нас есть несколько клиентов, которые используют поддержку ActiveX Matlab и испытывают затруднения при вызове методов COM-объекта с ПУСТЫМ параметром.

Они спросили, как они делают это в Matlab - и я обыскивал документацию MathWorks COM/ActiveX в течение приблизительно одного дня теперь и не могу понять это.

Их пример кода мог бы выглядеть примерно так:

function do_something()
   OurAppInstance = actxserver('Foo.Application');
   OurAppInstance.Method('Hello', NULL)
end

где NULL то, где на другом языке, записали бы мы NULL или nil или Nothing, или, конечно, передача в объекте. Проблема, это является дополнительным (и они реализованы как дополнительные параметры в большинстве, но не всех, случаях) - эти методы ожидают становиться ПУСТЫМИ довольно часто.

Они говорят мне, что попробовали [] (который от моего чтения казался наиболее вероятным), а также '', Nothing, 'Nothing', None, Null, и 0. Я понятия не имею, сколько из тех даже допустимые ключевые слова Matlab - конечно, ни один не работает в этом случае.

Кто-либо может помочь? Каков синтаксис Matlab для нулевого указателя / объект для использования в качестве параметра метода COM?

Обновление: Спасибо за все ответы до сих пор! К сожалению, ни один из ответов, кажется, не работает, даже libpointer. Ошибка является тем же во всех случаях:

Error: Type mismatch, argument 2

Этот параметр в библиотеке типа COM описан в RIDL как:

    HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult);

coclass рассматриваемые реализации единственный интерфейс, убывающий от IDispatch.

14
задан David 18 February 2010 в 05:42
поделиться

5 ответов

Я отвечаю на свой вопрос здесь, после разговора с техподдержкой Matlab: Нет эквивалента Nothing , и Matlab не поддерживает это.

Подробно: Matlab поддерживает необязательные аргументы, но не поддерживает передачу в вариантах NULL-указателей (на самом деле, чтобы точно проследить, как VB Nothing работает, вариант VT_EMPTY , я думаю ) в качестве необязательного аргумента или нет. Существует документация по некоторым типам null / указателям, многие из которых упоминаются в моем вопросе или в различных ответах, но они, похоже, не могут использоваться с их поддержкой COM.

Служба поддержки Matlab предложила мне обходной путь с использованием созданной ими COM DLL и Excel для создания фиктивного объекта ничего, который можно было бы передавать в сценариях. Мне не удалось заставить этот обходной путь / хак работать, и даже если бы я, к сожалению, не смог его распространять. Однако, если вы столкнетесь с той же проблемой, это описание может дать вам хотя бы отправную точку!

Править

Возможно это сообщение в блоге Old New Thing может быть связано с . (Я больше не работаю с доступом к проблемному исходному коду или к Matlab, чтобы освежить мою память или проверить.)

Вкратце, для IUnknown (или производных) параметров вам нужен [уникальный] для них должен быть NULL . Вышеупомянутое объявление требовало, чтобы Matlab создал или передал вариант VT_EMPTY , чего он не мог сделать.Возможно, добавление [unique] могло побудить движок Matlab передать вместо этого указатель NULL (или вариант, содержащий указатель NULL ) - при условии, что он мог это сделать, а это догадки.

Это все спекуляции, поскольку этот код и его сложности на данный момент отстали от меня на несколько лет. Однако я надеюсь, что это поможет любому будущему читателю.

9
ответ дан 1 December 2019 в 12:52
поделиться

Ответ Питера должен сработать, но вы можете попробовать NaN , который Matlab обычно использует в качестве значения NULL .

5
ответ дан 1 December 2019 в 12:52
поделиться

К сожалению, это невозможно только в CSS, однако вы можете достичь этого с помощью генераторов CSS, таких как LessCSS , которые имеют свой собственный синтаксис и имеют такие функции, как вложение и переменные.

-121--3740427-

Пробовали ли вы удалить TR, которые имеют колорит, и посмотреть, меняет ли он что-нибудь?

Я испытал колорисы и rowspans, чтобы быть довольно противным, когда речь идет о точных табличных конструкций. Если бы ваши изображения выглядели хорошо без colspan-TR, я бы начал оттуда и построил вложенную табличку.

Кроме того, ваш style.css не кажется полным, может, там что-то не так? Я бы хотя бы добавил заполнение: 0; margin: 0; к таблице (или к классу "mytable"). Убедитесь, что изображения не содержат пробелов и/или границ (например, добавив в таблицу стилей img {border: 0;} ).

-121--657386-

Помимо использования [] и libpointer (как предлагает Питер), можно также попробовать {}.

2
ответ дан 1 December 2019 в 12:52
поделиться

Из документации mathworks, вы можете использовать libpointer функцию:

p = libpointer;

и тогда p будет NULL указателем. Более подробную информацию см. на этой странице.

См. также: больше информации о libpointer.

4
ответ дан 1 December 2019 в 12:52
поделиться

Правильный ответ для чего-то в VB, ожидающего Nothing Аргумент заключается в том, чтобы каким-то образом получить COM / ActiveX Variant , который имеет вариантный тип VT_EMPTY . (см. документы MSDN , которые ссылаются на поведение маршалинга для Visual Basic Ничего )

MATLAB может сделать это с пустым массивом ([]), но я Я не уверен .... так что это может быть невозможно только в MATLAB. Хотя кто-то легко мог бы написать крошечную библиотеку COM, цель которой - создать вариант с VT_EMPTY.

Но если аргумент имеет атрибут [optional] , и вы хотите оставить этот необязательный аргумент пустым, вам следует не делать это. См. документацию COM / ActiveX по вариантам , в которых в разделе VT_EMPTY говорится:

VT_EMPTY: значение не было указано. Если необязательный аргумент метода автоматизации оставлен пустым, не передавайте VARIANT типа VT_EMPTY. Вместо этого передайте VARIANT типа VT_ERROR со значением DISP_E_PARAMNOTFOUND.

Matlab должен (но, вероятно, не предоставлять) методы для создания этих объектов («ничего» и «необязательный пробел»), чтобы вы могли правильно взаимодействовать с COM-объектами.

1
ответ дан 1 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: