COM経由で自動化できるプログラムを管理しています。通常、お客様はVBSを使用してスクリプトを作成しますが、使用するお客様が2、3人います。 MatlabのActiveXサポート と問題を抱えています nULLパラメータを使用してCOMオブジェクトメソッドを呼び出す。
彼らはMatlabでこれをどのように行うかを尋ねました-そして私は精査してきました MathworksのCOM/ActiveXドキュメント 1日かそこらで、それを理解することはできません。
サンプルコードは次のようになります。
function do_something()
OurAppInstance = actxserver('Foo.Application');
OurAppInstance.Method('Hello', NULL)
end
ここで、NULL
は、別の言語ではNULL
またはnil
またはNothing
と書くか、もちろんオブジェクトを渡します。問題は、これがオプションであるということです(そして、これらはほとんどの場合オプションのパラメーターとして実装されていますが、 すべてではない、cases)-これらのメソッドは、かなり頻繁にNULLを取得することを想定しています。
彼らは私に彼らが試したと言います[]
(私の読書から最も可能性が高いと思われた)および''
、Nothing
、'Nothing'
、None
、Null
、および0
。それらのうちどれだけが有効なMatlabキーワードであるかはわかりませんが、この場合は確かに機能しません。
誰か助けてもらえますか? COMメソッドパラメーターとして使用するnullポインター/オブジェクトのMatlabの構文は何ですか?
更新:これまでのすべての返信に感謝します!残念ながら、libpointer
でさえも、答えはどれもうまくいかないようです。エラーはすべての場合で同じです。
Error: Type mismatch, argument 2
COMタイプライブラリのこのパラメータは、RIDLで次のように記述されています。
HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult);
問題のコクラスは、IDispatchから派生した単一のインターフェイスを実装します。
Matlabのテクニカルサポートに相談した後、ここで私自身の質問に答えています:Nothing
に相当するものはなく、Matlabはこれをサポートしていません。
詳細:Matlabはオプションの引数をサポートしていますが、バリアントNULLポインターの受け渡しをサポートしていません(実際には、VBのNothing
の動作を正確に追跡するために、VT_EMPTY
バリアントだと思います)。か否か。いくつかのnull /ポインタ型に関するドキュメントがあり、その多くは私の質問やさまざまな回答で言及されていますが、これらはCOMサポートでは使用できないようです。
私は、COM DLL彼らが作成し、Excelを使用して、スクリプトで渡すことができるダミーの何もないオブジェクトを作成することで、Matlabサポートから回避策を与えられました。この回避策/ハックを取得できませんでした。動作していて、残念ながら再配布できなかった可能性があります。ただし、同じ問題が発生した場合は、この説明から少なくとも出発点が得られる可能性があります。
このOld New Thingブログ投稿mayが関連している可能性があります。 (問題のあるソースコードへのアクセス、またはMatlabへのアクセスを使用して、メモリを更新したりテストしたりすることはもうありません。)
簡単に言うと、IUnknown
(または派生)パラメーターの場合、それらが合法的にNULL
であるためには[unique]
属性が必要です。上記の宣言では、MatlabがVT_EMPTY
バリアントを作成または渡す必要がありましたが、これはできませんでした。おそらく、[unique]を追加すると、Matlabエンジンが代わりにNULL
ポインター(またはNULL
ポインターを含むバリアント)を渡すように促された可能性があります。これは、推測によるものです。
このコードとその複雑さはこの時点で私より数年遅れているので、これはすべて推測です。しかし、それが将来の読者の助けになることを願っています。
Peterの答えはうまくいくはずですが、試してみたいのはNaN
です。これは、Matlabが通常NULL
値として使用するものです。
mathworksのドキュメント から、libpointer
関数を使用できます。
p = libpointer;
そして、p
はNULL
ポインタになります。詳細については、そのページを参照してください。
参照: libpointerの詳細 。
[]とlibpointer(Peterによって提案された)を使用することに加えて、{}を試すこともできます。
Nothing
引数を期待しているVBの何かに対する正解は、どういうわけかVT_EMPTY
のバリアント型を持つCOM/ActiveX Variant
を取得することです。 ( MSDN docs VisualBasicのマーシャリング動作を参照するものを参照してくださいNothing
)
MATLABmayは、空の配列([]
)でこれを実行しますが、よくわかりません。したがって、MATLABだけでは不可能な場合があります。誰かがVT_EMPTYでバリアントを作成することを目的とした小さなCOMライブラリを簡単に書くことができますが。
ただし、引数に[optional]
属性があり、そのオプションの引数を空白のままにしたい場合は、notを実行する必要があります。 バリアントに関するCOM/ActiveXドキュメント を参照してください。これはVT_EMPTYの下にあります。
VT_EMPTY:値が指定されていません。 Automationメソッドのオプションの引数を空白のままにした場合は、タイプVT_EMPTYのVARIANTを渡さないでください。代わりに、値がDISP_E_PARAMNOTFOUNDのVT_ERROR型のVARIANTを渡します。
Matlabshould(ただし、おそらく提供しない)は、これらのオブジェクト( "nothing"および "optional blank")を作成するメソッドを提供するため、 COMオブジェクト。