我正在C#中构建一个具有静态类的应用程序,该类启动COM类并处理另一个挂钩键盘类的事件处理程序。 当我从WPF窗口中的按钮事件处理程序调用COM类的方法时,该方法没有任何问题,但是当我在静态类中的一个事件回调中调用它时,它会引发异常:
无法将“BLAHBLAH”类型的COM对象强制转换为接口类型 'BLAHBLAH'。此操作失败,因为QueryInterface调用 与IID接口的COM组件 '{9DD6680B-3EDC-40DB-A771-E6FE4832E34A}由于以下原因而失败 错误:自应用程序出现以来无法进行拨出呼叫 调度输入同步调用。 (HRESULT的例外情况: 0x8001010D(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))。
请告诉我,这个例外意味着什么,我该如何解决?
答案 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 看起来是因为线程(可能不是用户定义的线程)