2009-04-08 16 views
2

C++にATLで記述された32ビットCOMコンポーネントがあります。 64ビット.NETから使用する必要がある場合は、COM +アプリケーションを作成し、すべて正常に動作します。整形式COMインターフェイスでForeachが失敗する

最近、私たちはWin2k8で奇妙な動作に気付きました。コンポーネントのCOMオブジェクトはイベントを発生させ、.NETコードで処理します。このイベントには、アンマネージコードから渡されたパラメータもあります。イベントハンドラがIOurObjectInterfaceインスタンスを渡され

interface IOurCollectionInterface : IDispatch 
{ 
[propget, restricted, id(DISPID_NEWENUM)]] 
HRESULT _NewEnum([out, retval] IUnknown** result); 
} 

interface IOurObjectInterface : IDispatch 
{ 
[propget] 
HRESULT Collection([out, retval] IOurCollectionInterface** result); 
} 

は、ここで明確化(IDL表記)のための部分的な定義です。内部でforeach()ループを実行しようとします。次のメッセージとforeachのとライン上の

void onEvent(IOurObjectInterface ourObject) 
{ 
    foreach(object element in ourObject.Collection) { 
     //do stuff 
    } 
} 

コードがクラッシュ:IEnumVARIANTため QIは確かで返されるオブジェクトによって実装されて管理されていないサーバー上

IEnumVARIANTを失敗しましたIOurCollectionInterface::get__NewEnum()の実装。上記のコードは、WinXPとWin2k3では正常に動作しますが、Win2k8では動作しません。

このような動作の理由は何ですか?

+0

エラーのHRESULTとは何ですか? – Richard

答えて

0

しかし、マーシャル問題を疑うだろう。

IOurCollectionInterface._NewEnumの実装が実際に呼び出されていることを確認しましたか?

どのような種類のCOMマーシャリングを使用していますか? typelibの場合、typelibは正しく登録されていますか?

インターフェイスが処理中に実装されている場合は機能しますか?コメントから


sharptoothによって:

タイプライブラリのマーシャリングが使用され、タイプライブラリが登録されています。さらに悪いことに、このコンポーネントは、同じマシン上のWinFormsアプリケーションから呼び出されたときには正常に動作しますが、ローカルユーザで実行されるNTサービスから呼び出されたときには失敗します。

WinFormsのアプリケーションとサービスが異なるユーザーとして実行されている場合は、セキュリティを非常に注意深くチェックしてください。 COM +セキュリティを開始し、レジストリ/ファイルアクセスの問題についてProcess Monitorで確認してください(これは起こりそうもないが、常に可能です)。

+0

Typelibマーシャリングが使用され、タイプライブラリが登録されています。さらに悪いことに、このコンポーネントは、同じマシン上のWinFormsアプリケーションから呼び出されたときには正常に動作しますが、ローカルユーザで実行されるNTサービスから呼び出されたときには失敗します。 – sharptooth

0

システムアカウントで実行し、エラーに関する詳細情報を確認してください。

関連する問題