InvalidCastException:RPC_E_CANTCALLOUT_ININPUTSYNCCALL

时间:2008-12-29 22:17:59

标签: exception com

我正在C#中构建一个具有静态类的应用程序,该类启动COM类并处理另一个挂钩键盘类的事件处理程序。 当我从WPF窗口中的按钮事件处理程序调用COM类的方法时,该方法没有任何问题,但是当我在静态类中的一个事件回调中调用它时,它会引发异常:

  

无法将“BLAHBLAH”类型的COM对象强制转换为接口类型   'BLAHBLAH'。此操作失败,因为QueryInterface调用   与IID接口的COM组件   '{9DD6680B-3EDC-40DB-A771-E6FE4832E34A}由于以下原因而失败   错误:自应用程序出现以来无法进行拨出呼叫   调度输入同步调用。 (HRESULT的例外情况:   0x8001010D(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))。

请告诉我,这个例外意味着什么,我该如何解决?

2 个答案:

答案 0 :(得分:1)

将代码包装在新线程中:

Thread thread = new Thread(() =>
{
    ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
    foreach (ManagementObject currentObject in theSearcher.Get())
    {
        Debug.WriteLine("Device present: " + currentObject);          
        ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
        serial = theSerialNumberObjectQuery["SerialNumber"].ToString();
    }
});
thread.Start();
thread.Join(); //wait for the thread to finish

答案 1 :(得分:0)

参考此KB http://support.microsoft.com/kb/198996 看起来是因为线程(可能不是用户定义的线程)