我实例化一个服务类,它包含一个执行终端自动化的COM互操作组件。我正在使用Microsoft的任务库(TPL)。我想从TPL任务(后台线程)调用COM对象,以便在COM对象工作时我的UI不冻结。从后台线程调用COM Interop API?
但是,当我从后台线程(它接收一个IntPtr)调用我的第一个函数时抛出一个COM异常详细HRESULT:0xC0000005。
我知道这是一个访问冲突异常,我认为我没有用正确的方式来掠夺我的对象。
如何从后台线程在主线程中创建的COM对象调用方法?调用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();
}
方法:作了
int LoadStuffFromCOM()
{
string buffer;
IntPtr pointer = Marshal.StringToHGlobalUni(buffer);
return comObject.GetValue(pointer); // Exception here...
}
COM异常'0xC0000005'是'访问denied'。这是一个特权错误。由于您没有发布代码,因此很难找出可能导致它的原因。 “当我打电话给我的第一个功能”并不值得继续时,恐怕。你可以编辑你的问题提供更多的细节? –
我从后台线程调用一个函数。它接收一个从COM输出一些值的IntPtr。如果我在主线程上运行它,它工作得很好。 –
对不起,只是因为我不允许这样做,所以我不能提供很多代码。 –