2017-11-14 15 views
0

オブジェクトこれらのオブジェクトのうち:SAFEARRAYは、私はCOMライブラリを使用していると私は、次のよう.tlhファイルで定義されたインタフェースを持っている

SAFEARRAYBOUND rgsabound[1]; 
rgsabound[0].cElements = 2; 
rgsabound[0].lLbound = 0; 

SAFEARRAY *pData = SafeArrayCreate(VT_VARIANT, 1, rgsabound); 

LONG i = 0; 
SafeArrayPutElement(pData, &i, pMyInterface1); 
i = 1; 
SafeArrayPutElement(pData, &i, pMyInterface2); 

しかし、この配列要素の後も空のままです。このIMyInterfacePtrオブジェクトの配列を埋める適切な方法はどれですか?

ありがとうございました。

------ EDIT ------答えを

感謝。コメントからこれらのソリューションを試しましたが、残念ながらまだ動作しません。この配列をCOMメソッドでCOMに送り返す必要があります。 (SAFEARRAY *value)put_Responseは署名を以下ました

IResponsePtr pResponse;//This is also smart com ptr 
pResponse.CreateInstance(CLSID_Response); 
pResponse->put_Response(pData);//safearray here 

:だから私は、新しいオブジェクトを作成しています。 残念ながら、このメソッドを呼び出す時に、私は次の例外を取得しています:

First-chance exception at 0x76BEC54F in MyApp.exe: Microsoft C++ exception: EEException at memory location 0x0042F144. 
First-chance exception at 0x76BEC54F (KernelBase.dll) in MyApp.exe: 0xE0434352 (parameters: 0x80131533, 0x00000000, 0x00000000, 0x00000000, 0x72D30000). 

このSAFEARRAYのPTRと間違っているかもしれないものの任意のアイデア?

+0

例外として、コールスタックを示します。 COMコンポーネントの開発者に問い合わせてください。多分あなたのインターフェースは間違っています...多くの可能性に...あなたの編集は新しい質問です。元のものとは何の関係もありません。この質問に回答してください。新しい質問を作成し、あなたが持っている新しいコードを表示してください。 – xMRi

答えて

3

ポインタを使用しないでください。最初にバリアントにポインタを格納し、データをコピーします。ときにコピーバリアント

VARIANT v; 
v.vt = VT_UNKNOWN; 
v.punkVal = pMyInterface1; 
SafeArrayPutElement(pData, &i, &v); 

SafeArrayPutElementは内部AddRefを使用しています。

+0

そのサンプルコードでVariantClearを呼び出さないでください。SafeArrayはインターフェイスに参照を保持する必要があります(この参照は、SafeArrayがクリアされたときに削除されます)。またはv.punkValを定義するためにQueryInterfaceを最初に呼び出してください(私はここでお勧めします、ポインタを割り当てることは危険です) –

+0

あなたは正しいです...私の答えを変えました!ユーザーはこれを見たことのないスマートポインタを使用します。 – xMRi

関連する問題