web-dev-qa-db-ja.com

COM / ActiveXメソッドを呼び出す場合のMatlabのNULLに相当するものは何ですか?

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'NoneNull、および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から派生した単一のインターフェイスを実装します。

14
David

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ポインターを含むバリアント)を渡すように促された可能性があります。これは、推測によるものです。

このコードとその複雑さはこの時点で私より数年遅れているので、これはすべて推測です。しかし、それが将来の読者の助けになることを願っています。

9
David

Peterの答えはうまくいくはずですが、試してみたいのはNaNです。これは、Matlabが通常NULL値として使用するものです。

5
Geodesic

mathworksのドキュメント から、libpointer関数を使用できます。

p = libpointer;

そして、pNULLポインタになります。詳細については、そのページを参照してください。

参照: libpointerの詳細

4
Peter

[]とlibpointer(Peterによって提案された)を使用することに加えて、{}を試すこともできます。

1
Yair Altman

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オブジェクト。

1
Jason S