3

COM Interop を使用して COM コンポーネントを使用している .NET アプリケーションがあります。コンポーネント自体がインスタンス化され、インターフェイス ポインターが API cal で .net ラッパーに返されます。アプリケーション フローの後半で、COM への呼び出しが行われます。成分。

//Pseudo code 

//CLISD_ITEM is a another CoClass housed by this COM component, the component is a STA based dll 

HRESULT GetItem(ITem **ptr)

{

HRESULT hr = CoCreateInstance(CLSID_ITEM.....,....(void **) &pItem);

pItem->QI(ptr);

}

私の質問は、関数 GetItem 内で CoInitialize と CoUninitialize() を呼び出す必要があるかどうかです。現在、これらの呼び出しを行っておらず、コードは正常に動作しているようですが、CoCreateInstance を呼び出すときに断続的なクラッシュが報告されています。

誰かがここで私を助けることができれば.

4

2 に答える 2

1

.NET 内でSetApartmentStateを使用して STA とマークされたスレッドからこれを使用している場合、これを行う必要はありません。

これを UI スレッド (つまり、メインの Windows フォームまたは WPF スレッド) で直接呼び出している場合、これは既に行われています。

于 2013-10-17T17:06:08.613 に答える
1

いいえ、CoInitializeEx() は常にスレッドの所有者が呼び出す必要があります。コンポーネント自体ではなく、スレッドを開始しませんでした。アパートの保証を処理する必要があるため、どのアパートタイプが正しいかを判断できるのは所有者だけです。特に、STA スレッドはメッセージ ループをポンピングする必要があります。コンポーネントはその保証を提供できません。

そして、これは .NET アプリで一貫して行われます。CLR は、マネージ コードをスレッドで実行できるようにする前に、常に CoInitializeEx() を呼び出します。アパートメント タイプは、スタートアップ スレッドの Main() エントリポイントの [STAThread] または [MTAThread] によって選択されます。ワーカー スレッドの Thread.SetApartmentState() 呼び出しです。スレッドプール スレッドは常に MTA に参加します。

クラッシュの別の理由を探す必要があります。

于 2013-10-17T17:59:22.590 に答える