C++/WinUI 3 技术笔记:(二)框架代码分析

前一节创建了一个 C++/WinUI 3 应用,接着分析默认生成的框架代码。框架代码中使用了大量 C++ 模板技术和新语言特性,发挥了 C++ 语言零开销抽象的优势,很值得学习。 App 应用入口 重新回到应用入口类 App。 struct App : AppT<App> { App(); void OnLaunched(Microsoft::UI::Xaml::LaunchActivatedEventArgs const&); private: winrt::Microsoft::UI::Xaml::Window window{ nullptr }; }; 应用的入口 App 类继承于一个代码生成的模板 AppT,这里用到的 C++ 奇异模板递归(CRTP)技术和 ATL 一脉相承。 template <typename D, typename ... Interfaces> struct AppT: public ::winrt::Microsoft::UI::Xaml::ApplicationT<D, ::winrt::Microsoft::UI::Xaml::Markup::IXamlMetadataProvider, Interfaces...> { using IXamlType = ::winrt::Microsoft::UI::Xaml::Markup::IXamlType; void InitializeComponent() { if (_contentLoaded) return; _contentLoaded = true; ::winrt::Windows::Foundation::Uri resourceLocator{ L"ms-appx:///App.xaml" }; ::winrt::Microsoft::UI::Xaml::Application::LoadComponent(*this, resourceLocator); } IXamlType GetXamlType(::winrt::Windows::UI::Xaml::Interop::TypeName const& type) { return AppProvider()->GetXamlType(type); } IXamlType GetXamlType(::winrt::hstring const& fullName) { return AppProvider()->GetXamlType(fullName); } ::winrt::com_array<::winrt::Microsoft::UI::Xaml::Markup::XmlnsDefinition> GetXmlnsDefinitions() { return AppProvider()->GetXmlnsDefinitions(); } private: bool _contentLoaded{false}; winrt::com_ptr<XamlMetaDataProvider> _appProvider; winrt::com_ptr<XamlMetaDataProvider> AppProvider() { if (!...

September 2, 2022 · 3 min · lyincc

C++/WinUI 3 技术笔记:(一)创建第一个 WinUI 3 项目

微软在 Windows 10 Version 1809 上正式发布了新的 UI 框架,命名为 WinUI 3。 这已经是微软发布的第不知道多少个 UI 框架了,但是微软宣称它将支持原生 C++ 和 Win32 应用。这引起了我的注意,因为微软已经很久没有为 Win32 提供新的技术了。 WinUI 3 与 Win32、UWP 按微软的说法,WinUI 3 是同时为 Win32 和 UWP 程序提供支持的,也就是说它应该允许独立运行在 Win32 框架上,不受 UWP 的权限管理限制。 对于 C++ 开发者,WinUI 3 借助 C++/WinRT 有完全的原生 C++ 支持,而不需要 C++/CX 或 C++/CLI 这样剑走偏锋的设计。这无疑对 GCC 或 Clang 上编译 WinUI 3 留下了可能。作为开发者,着实不希望微软带领技术走向分裂。 对于 UI 设计,WinUI 3 继承了 UWP 程序的 XAML 技术,为用户提供了 Fluent 风格的控件和交互体验。也就是说在核心的 UI 开发方式上,还是和 UWP 保持一致的,只是控件风格有所改变。但是 WinUI 3 不受 UWP 复杂的权限约束限制,可以说对 Win32 开发者十分友好了。...

February 3, 2022 · 3 min · lyincc

Windows Filtering Platform (WFP)

简介 WFP 是微软为 Windows 平台设计的新的网络过滤处理平台,用来代替 Windows XP 和 Windows 2003 上的 hook 形式的网络过滤引擎。 架构 WFP 架设在 TCP/IP 协议栈驱动 tcpip.sys 上,同时为用户态和内核态应用提供了网络过滤接口。也就是说,WFP 是工作在 OSI 的网络层,可以截获所有 TCP/IP 协议数据包。 显然,如果应用采用了其他网络层协议栈,WFP 将不能拦截。这就需要更加底层的 NDIS Filter 驱动来实现了。 接口 WFP 的接口分为几个不同组件。 Callout API 提供了核心的包过滤功能。应用程序创建的过滤器通过 WFP 的 Callout 机制获取不同层次的内核态网络数据包,并进行过滤操作。相关 API 多以 Fwps 开头命名。 Management API 提供了对过滤器的管理功能,支持动态添加和移除过滤器。相关 API 多以 Fwpm 开头命名。 IKE/AuthIP API 提供了对 IKE 和 AuthIP 的管理功能。相关 API 多以 Ikeext 开头命名。 IPsec API 提供了对 IPsec 协议的管理功能。相关 API 多以 Ipsec 开头命名。...

January 24, 2022 · 1 min · lyincc

Windows 包过滤技术

包过滤技术 Windows 经过微软多年迭代,为开发者提供了多种网络包过滤技术,包括 user-mode 和 kernel-mode 的不同系统层级下的过滤技术。 Raw Socket 微软在 Winsock 2 后提供了原始套接字(Raw Socket)功能,和 Linux 类似,原始套接字可以在用户态接受所有经过 Winsock 的 IP 协议数据包。但是这种方法只能进行监听,而不能过滤和拦截。并且对于不经过 Winsock 的网络流量,不能被这个层次侦听。如通过传输驱动程序接口(TDI,Transport Driver Interface)通信的流量。 Winsock DLL 如果需要在 Winsock 层次实现过滤和,可以选择修改系统 Winsock DLL 文件,或者动态 HOOK Winsock 相关函数。但是同样的,无法接触到 Winsock 之外的网络流量。 LSP / SPI 在 Winsock 2 中,微软除了提供了 Socket API 还通过分层服务提供者(LSP,Layered Service Provider)提供了一个 Winsock 服务提供接口(SPI,Service Provider Interface),通过 LSP 可以向其他应用程序提供包传输和名称解析等服务。其他程序可以通过 ws2_32.dll 和 LSP 程序进行通信。 通过 LSP 提供的分层协议、基础协议来替换 Winsock 的默认协议,并用协议链重组重新串联数据包通道。这样就可以通过 LSP 实现 Winsock 包流量过滤和拦截。 Windows 2000 Packet Filtering Interface 微软在 Windows 2000 中提供了一个特别的网络包过滤接口,可以实现 IP 和端口的过滤。...

November 19, 2021 · 1 min · lyincc

WinDBG 使用

Windows 平台下的调试工具

April 8, 2020 · 3 min · lyincc