ターミナルオートメーションを実行する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...
}
COM例外 '0xC0000005'は'アクセスdenied'です。これは特権エラーです。あなたがコードを投稿していないので、何が原因か分かりにくいです。 「私の最初の機能を呼んだとき」はそれほど進んでいない、と私は恐れている。詳細を提供するために質問を編集できますか? –
私はバックグラウンドスレッドから関数を呼び出しています。 COMからいくつかの値を出力するIntPtrを受け取ります。私がメインスレッドで実行するとうまく動作します。 –
申し訳ありませんが、私はそうすることが許可されていないので、私は多くのコードを提供することはできません。 –