インターフェイスのメソッドが存在する ATL COM サーバーがあります。
STDMETHODIMP CWrapper::RUN(long iDataSize, SAFEARRAY** iData)
この関数の MIDL は次のようになります。
[id(1), helpstring("method RUN")] HRESULT RUN([in] long nSize, [in, size_is(nSize)] SAFEARRAY(_MyDataType*)* iData);
tlbimp を使用してこのプロジェクトから tlb をインポートするので、ネイティブ配列を使用できます。次に、次のようにC#から呼び出します
m_ServerWrapper.RUN(iInputs.Length,ref iInputs)
ここで、Inputs は既に割り当てられており、C# プログラム内から別の COM オブジェクトで埋められています。ここで、C++ ラッパーをBadPtr
呼び出すと、セーフ配列があり、配列から後続の COM オブジェクトへの呼び出しがCWrapper::RUN
失敗し、配列が最終的な dll に到達しません。未割り当てと表示されます。誰かが私が間違っていることについて何か手がかりを持っていますか? ありがとう
編集:配列はC#で問題なく見えると述べるべきでした。
EDIT2: デバッガーは のiData
safearray を示していますIDispatch* = 0x0000000 <Bad Ptr>, 5, 0x0000000 <Bad Ptr>({lpvtbl = 0xblahblah},...
。それで、私の情報の一部がそこに届いているようです。