c++-winrt - 使用 winrt::static_lifetime 时如何获取类的实例?

标签 c++-winrt

我不久前从 C++/CX 切换到 C++/winrt,目前我被卡住了,因为我想创建一个单例 winrt 类。我阅读了有关 winrt::static_lifetime ( https://learn.microsoft.com/en-us/uwp/cpp-ref-for-winrt/static-lifetime ) 的信息,但它们没有提供有关如何使用它的任何代码示例。 所以我的问题是如何用这个获取类的实例?

提前感谢您的帮助。

最佳答案

winrt::static_lifetime 指定工厂是单例,因此您基本上需要将单例实例实现为(现在是单例)工厂的属性。

即:

namespace Foo::implementation {
    struct Foo : FooT<Foo> {
        Foo() {
        }

        static Foo Singleton() {
            auto fooFactory = winrt::make<factory_implementation::Foo>();
            return fooFactory->Singleton();
        }
    };
}

namespace Foo::factory_implementation {
    // specifies the factory is a singleton
    struct Foo : FooT<Foo, implementation::Foo, winrt::static_lifetime> 
    {
        Foo Singleton() {
            slim_lock_guard lock{ m_lock };
            if (!m_singleton) {
                m_singleton = winrt::make<Foo>();
            }
            return m_singleton;
        }

    private:
        winrt::slim_mutex m_lock;
        Foo m_singleton;
    };
}

那么为什么与类似的东西相比,这更受欢迎:

static Foo Singleton() {
    static auto single = winrt::make<Foo>();
    return single;
}

之所以这样做是因为进程静态可能在 RoUninitialize 之后被破坏导致崩溃。 winrt::static_lifetime 基本上将工厂放入 CoreApplication.Properties 中,它在进程执行 RoUninitialize 之前安全地未初始化。这基本上与过去需要避免将遗留 COM 对象存储到进程全局变量中的原因相同。

关于c++-winrt - 使用 winrt::static_lifetime 时如何获取类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155076/

相关文章:

c++ - 是否可以使用 C++/WinRT 创建 Windows 服务应用程序?

c# - C++/WinRT UWP FileOpenPicker 缺失

window - 如何获取承载 UIElement 实例的窗口

c++ - 如何在 c++/winrt UWP 应用程序中使用 SVG 图像?

c++ - native C++ 库与 UWP 互操作的建议/经验

c++ - C++/WinRT 到底是什么?

c++-cx - 将 C++/CX "delegate"对象转换为 C++/WinRT 中的等效对象

uwp - 如何控制 Windows ML 用于评估的线程数

mysql - 如何从 C++/WinRT UWP 应用连接到 SQL Server?

c++ - .idl文件中使用的 `cpp_quote`和 `pragma midl_echo`为什么不向C++/WinRT项目中生成的 header 输出任何内容?