Quel est le Matlab équivalent de NULL, quand il appelle COM/ActiveX méthodes?
Je maintenir un programme qui peut être automatisé via COM. Généralement les clients à utiliser les VBS pour faire leur script, mais nous avons un couple de clients qui utilisent Matlab ActiveX support et de la difficulté appel COM méthodes de l'objet avec un paramètre NULL.
Ils nous ont demandé comment ils le font dans Matlab et j'ai été à récurer Mathworks COM/ActiveX documentation pour un jour ou deux et ne peut pas le comprendre.
Leur exemple de code pourrait ressembler à quelque chose comme ceci:
function do_something()
OurAppInstance = actxserver('Foo.Application');
OurAppInstance.Method('Hello', NULL)
end
où NULL
est là dans une autre langue, nous vous écrire NULL
ou nil
ou Nothing
, ou, bien sûr, passer un objet. Le problème c'est que c'est facultatif (et ceux-ci sont mis en œuvre en tant que paramètres optionnels dans la plupart, mais pas, les cas) - ces méthodes s'attendre à obtenir NULL assez souvent.
Ils me disent qu'ils ont essayé []
(qui d'après mes lectures me semblait le plus probable) ainsi que ''
, Nothing
, 'Nothing'
, None
, Null
, et 0
. Je n'ai aucune idée de la façon dont beaucoup de ceux qui sont encore valides Matlab des mots - clés, certainement pas de travail dans ce cas.
Peut aider quelqu'un? Ce qui est Matlab syntaxe d'un pointeur null /objet pour l'utiliser comme une méthode COM paramètre?
Mise à jour: Merci pour toutes les réponses pour l'instant! Malheureusement, aucune de ces réponses semblent fonctionner, même pas libpointer
. L'erreur est la même dans tous les cas:
Error: Type mismatch, argument 2
Ce paramètre dans la COM bibliothèque de type est décrit dans la RIDL:
HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult);
La coclasse en question met en œuvre une interface unique descendant de IDispatch.
OriginalL'auteur David M | 2010-02-17
Vous devez vous connecter pour publier un commentaire.
Je vais répondre à ma propre question ici, après avoir parlé à Matlab support technique: la Il n'y a pas d'équivalent de
Nothing
, et Matlab ne prend pas en charge cette.En détail: Matlab prend en charge les arguments optionnels, mais ne prend pas en charge la transmission de la variante de pointeurs NULL (en fait, de suivre exactement comment VB est
Nothing
œuvres, unVT_EMPTY
variante, je pense) que ce soit comme un argument facultatif ou non. Il y a de la documentation sur certains null /pointerish types, beaucoup de ce qui est mentionné dans ma question ou dans diverses réponses, mais elles ne semblent pas être utilisables avec leur prise en charge COM.M'a donné une solution de contournement en Matlab charge l'utilisation d'une DLL COM ils ont créé et Excel afin de créer un mannequin rien d'objets qui pourraient être passés dans les scripts. Je n'ai pas réussi à obtenir cette solution de contournement /hack de travail, et même si j'avais malheureusement, je ne pouvait sans doute pas de le redistribuer. Toutefois, si vous rencontrez le même problème que cette description pourrait vous donner un point de départ au moins!
Modifier
Il est possible cette Vieille Chose de Nouveau post de blog peut être liés. (Je n'ai plus de travail avec accès à la problématique de code source, ou de l'accès à Matlab, pour me rafraîchir la mémoire ou pour des tests).
Brièvement, pour
IUnknown
(ou dérivés) des paramètres, vous avez besoin d'un[unique]
attribut pour eux d'être légalementNULL
. La déclaration ci-dessus requises Matlab de créer ou de passer dans unVT_EMPTY
variante, qu'il ne pouvait pas le faire. Peut-être l'ajout d' [unique] peut-être provoqué l'Matlab moteur à passer dans unNULL
pointeur (ou un variant contenant unNULL
pointeur), au lieu - en supposant qu'il était capable de le faire, ce qui est une conjecture.Ce n'est que spéculation puisque ce code et les subtilités de plusieurs années derrière moi à ce point. Cependant, j'espère que ça aide un futur lecteur.
OriginalL'auteur David M
La réponse de pierre devrait fonctionner, mais quelque chose que vous pourriez vouloir essayer est
NaN
, qui est ce que Matlab utilise habituellement comme unNULL
valeur.OriginalL'auteur Geodesic
De la mathworks documentation, vous pouvez utiliser le
libpointer
fonction:et puis
p
sera unNULL
pointeur. Voir cette page pour plus de détails.Voir aussi: plus d'informations sur libpointer.
OriginalL'auteur Peter
En outre à l'aide de [] et libpointer (comme l'a suggéré Pierre), vous pouvez aussi try {}.
OriginalL'auteur Yair Altman
La réponse correcte pour quelque chose en VB qui attend un
Nothing
argument, est en quelque sorte avoir COM/ActiveXVariant
qui est une variante du type deVT_EMPTY
. (voir MSDN docs qui référence des gares de comportement pour Visual BasicNothing
)MATLAB peut le faire avec le tableau vide (
[]
), mais je ne suis pas sûr.... donc il peut ne pas être possible uniquement dans MATLAB. Bien que quelqu'un pourrait facilement écrire un petit COM de la bibliothèque dont le but est de créer une Variante avec VT_EMPTY.Mais si l'argument a le
[optional]
atttribute, et que vous voulez quitter argument optionnel vide, vous devez pas ce faire. Voir la COM/ActiveX docs sur les Variantes qui dit sous VT_EMPTY:Matlab devrait (mais n'a probablement pas) fournir des méthodes pour créer ces objets (un "rien" et une "option vide") de sorte que vous peut s'interfacer correctement avec les objets COM.
OriginalL'auteur Jason S