Подтвердить что ты не робот

Что такое эквивалент Matlab NULL, когда он вызывает методы COM/ActiveX?

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

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

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

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

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

Они говорят мне, что они пробовали [] (что из моего показа показалось наиболее вероятным), а также '', 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);

В рассматриваемом классе используется один интерфейс, спускающийся с IDispatch.

4b9b3361

Ответ 1

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

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

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

Изменить

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

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

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

Ответ 2

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

Ответ 4

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

Ответ 5

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

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

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

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

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