C++/WinRT调用GetDeviceSelector报-1073741819退出码如何修复
问题原因
退出码-1073741819对应十六进制值为0xC0000005,是Windows平台典型的内存访问违例错误,代码存在两个核心问题:
- 代码中
IHidDeviceStatics hello是默认初始化的空智能指针,内部没有绑定任何实际的WinRT激活工厂实例,直接调用其方法等价于空指针虚函数调用,会直接触发进程崩溃。这类底层内存访问错误属于系统级异常,不会被普通的catch(...)逻辑捕获。 - 传入
GetDeviceSelector的参数类型不匹配:该接口要求usagePage、usageId、vendorId、productId四个参数均为uint16_t(无符号16位整型),代码中使用32位int类型传参,即使接口实例正常,也可能因参数内存布局不匹配引发异常。
修复方案
- 不要使用默认构造的空静态接口对象调用方法。C++/WinRT已经对WinRT类的静态方法做了投影封装,直接通过类名调用静态方法即可,框架内部会自动完成激活工厂的获取逻辑,不需要手动操作接口实例。如果确实需要直接操作静态接口,需通过
get_activation_factory方法获取合法的接口实例。 - 将所有传入接口的参数修正为
uint16_t类型,与接口签名要求保持一致。
修复后的参考代码:
#include "pch.h" #include <iostream> #include <string> using namespace winrt; using namespace Windows::Foundation; using namespace winrt::Windows::Devices::HumanInterfaceDevice; int main() { init_apartment(); // 修正参数类型为接口要求的uint16_t uint16_t const product = 0x09CC; uint16_t const vid = 0x054C; uint16_t const usagePage = 0x01; uint16_t const usageId = 0x02; try { printf("trying\n"); // 直接使用C++/WinRT投影提供的静态方法,无需手动构造IHidDeviceStatics实例 winrt::hstring data = HidDevice::GetDeviceSelector(usagePage, usageId, vid, product); printf("Get device selector success\n"); } catch (winrt::hresult_error const& e) { printf("WinRT call failed: %ls\n", e.message().c_str()); } catch (...) { printf("Unknown runtime error\n"); } return 0; }
补充说明:如果运行时出现权限类错误,需要在项目清单中配置对应HID设备的访问权限;桌面环境下调用该接口还需提前完成WinRT运行时的初始化适配。
内容的提问来源于stack exchange,提问作者R3sist
相关产品推荐
相关产品推荐

