Windows10调用DxDiag接口触发Miracast相关CWiFiDisplayException崩溃问询
根本原因
该问题是Windows 10原生系统组件的已知bug,仅在1903到21H1区间的特定Win10版本上触发,崩溃路径如下:
调用DxDiag接口枚举显示设备属性时,dxdiagn.dll会内部调用WiFiDisplay.dll的IsMiracastSupportedByWlan接口检测Miracast支持状态,该接口会进一步调用wlanapi的WFDOpenHandle打开Wi-Fi Direct显示服务句柄。当系统Miracast服务状态异常、WLAN驱动存在兼容性问题,或Wi-Fi Direct组件未正常初始化时,WFDOpenHandle内部会触发未捕获的RPC异常直接向上抛出,而dxdiagn.dll未对这部分异常做捕获处理,最终导致进程崩溃,因触发条件和设备环境强相关,所以表现为偶现。
可行的规避方案
- 方案1:为DxDiag调用段添加结构化异常处理
在调用IDxDiagProvider相关接口的代码外层添加SEH(结构化异常处理),捕获所有系统抛出的未预期异常,避免进程直接崩溃,参考实现如下:
__try { // 此处放置原有DxDiag相关调用代码 if (SUCCEEDED(dxDiagProvider->Initialize(&initParams)) && SUCCEEDED(dxDiagProvider->GetRootContainer(&rootContainer))) { IDxDiagContainer* childContainer; if (SUCCEEDED(rootContainer->GetChildContainer(L"DxDiag_DisplayDevices", &childContainer))) childContainer->Release(); rootContainer->Release(); } } __except(EXCEPTION_EXECUTE_HANDLER) { // 异常分支标记DxDiag信息获取失败即可,不影响主流程 }
- 方案2:改用其他接口采集显示设备信息
如果不需要DxDiag提供的特殊显示属性,可以直接使用EnumDisplayDevices、Direct3D设备枚举等原生接口获取显卡、显示设备信息,完全规避调用dxdiagn.dll相关接口,从根源上避免触发该问题。 - 方案3:引导用户更新系统和驱动
面向终端用户的软件可以提示偶发崩溃的用户安装Windows最新累积更新,或升级无线网卡驱动,部分新版本的Win10累积更新已经修复了该异常未捕获的问题。
内容的提问来源于stack exchange,提问作者Mats391
相关产品推荐
相关产品推荐

