2011-10-27 17 views
-1

ターミナルオートメーションを実行するCOM相互運用コンポーネントを含むサービスクラスをインスタンス化します。私はMicrosoftからTask Library(TPL)を使用しています。 COMオブジェクトが動作している間、私のUIがフリーズしないように、TPLタスク(バックグラウンドスレッド)からCOMオブジェクトを呼び出す必要があります。バックグラウンドスレッドからCOM Interop APIを呼び出しますか?

しかし、私はCOM例外が詳述HRESULTをスローされます(のIntPtrを受けて)バックグラウンドスレッドから私の最初の関数を呼び出すとき:0xc0000005で。

は、私は、これは、アクセス違反の例外である知っていると私は私が私のオブジェクトの右の道をmashalingないと思います。

はどのようにして、バックグラウンドスレッドからメインスレッドで作成されたCOMオブジェクトからメソッドを呼び出すことができますか?

public void Button1_Click(object sender, EventArgs e) 
{ 
    var comWrapper = new COMWrapper(); // A simple wrapper for a COM object 

    Task.Factory 
     .StartNew(() => LoadStuff(comWrapper)) 
     .ContinueWith(() => { 
      // Output results... 
     }); 
} 

int LoadStuff(COMWrapper w) 
{ 
    return w.LoadStuffFromCOM(); 
} 

COMオブジェクトを呼び出す方法:

int LoadStuffFromCOM() 
{ 
    string buffer; 
    IntPtr pointer = Marshal.StringToHGlobalUni(buffer); 

    return comObject.GetValue(pointer); // Exception here... 
} 
+0

COM例外 '0xC0000005'は'アクセスdenied'です。これは特権エラーです。あなたがコードを投稿していないので、何が原因か分かりにくいです。 「私の最初の機能を呼んだとき」はそれほど進んでいない、と私は恐れている。詳細を提供するために質問を編集できますか? –

+0

私はバックグラウンドスレッドから関数を呼び出しています。 COMからいくつかの値を出力するIntPtrを受け取ります。私がメインスレッドで実行するとうまく動作します。 –

+0

申し訳ありませんが、私はそうすることが許可されていないので、私は多くのコードを提供することはできません。 –

答えて

-1

を記述する必要があります、バックグラウンドで実行されているCOM/OLE相互運用オブジェクトを持つことが可能であるが、彼らはMTAのためのDelphiの場合は、正しいスレッドモデル

でコンパイルする必要があります

initialization 
    TTypedComObjectFactory.Create(ComServer, TSomeLogic, Class_SomeLogic, 
    ciMultiInstance, tmApartment); 
end. 
を使用して、デフォルトではSTAの場合

initialization 
    TTypedComObjectFactory.Create(ComServer, TSomeLogic, Class_SomeLogic, 
    ciMultiInstance, tmFree); 
end. 

をコンパイルする必要がありますは

これは、C/C++およびその他の管理対象外の言語でsimmilarあるべき

詳しい情報はここで見つけることができます: http://msdn.microsoft.com/en-us/library/ff647812.aspx#scalenetchapt07 _topic11

1

多くの従来のCOMオブジェクトは、デスクトップアプリケーションの内部で実行するために行われました。つまり、唯一の同期方法としてWindowsのメッセージポンプを使用して、UIスレッドを実行することを期待していました。

あなたは今、それは「を聞いたことありません」ていないかもしれ環境でそのコードを実行しようとしています。著者がコードを書いたときに仮定したことに違反している可能性があります。あなたは仮定に違反していないが、あなたがしなければ、その後、あなたは、問題(または2つ、または2ダース)を持っているつもりなら

コードが動作する可能性があります。

0

あなたが必死であれば、comコードを実行した別のプロセス全体が起動できます。あなたはだけ IPC

関連する問題