Я поддерживаю программу, которая может быть автоматизирована через 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.
Я отвечаю на свой вопрос здесь, после разговора с техподдержкой 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
) - при условии, что он мог это сделать, а это догадки.
Это все спекуляции, поскольку этот код и его сложности на данный момент отстали от меня на несколько лет. Однако я надеюсь, что это поможет любому будущему читателю.
Ответ Питера должен сработать, но вы можете попробовать NaN
, который Matlab обычно использует в качестве значения NULL
.
К сожалению, это невозможно только в CSS, однако вы можете достичь этого с помощью генераторов CSS, таких как LessCSS , которые имеют свой собственный синтаксис и имеют такие функции, как вложение и переменные.
-121--3740427-Пробовали ли вы удалить TR, которые имеют колорит, и посмотреть, меняет ли он что-нибудь?
Я испытал колорисы и rowspans, чтобы быть довольно противным, когда речь идет о точных табличных конструкций. Если бы ваши изображения выглядели хорошо без colspan-TR, я бы начал оттуда и построил вложенную табличку.
Кроме того, ваш style.css не кажется полным, может, там что-то не так? Я бы хотя бы добавил заполнение: 0; margin: 0;
к таблице (или к классу "mytable").
Убедитесь, что изображения не содержат пробелов и/или границ (например, добавив в таблицу стилей img {border: 0;}
).
Помимо использования [] и libpointer (как предлагает Питер), можно также попробовать {}.
Из документации mathworks, вы можете использовать libpointer
функцию:
p = libpointer;
и тогда p
будет NULL
указателем. Более подробную информацию см. на этой странице.
См. также: больше информации о libpointer.
Правильный ответ для чего-то в 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-объектами.