【问题标题】:How to load a resource from a dll in UWP?如何从 UWP 中的 dll 加载资源?
【发布时间】:2016-12-22 05:51:12
【问题描述】:

我在 DLL 文件中嵌入了一些 .cur 文件,我想在我的 UWP C++ 项目中加载和使用它们。这有可能吗?

我知道在 Win32 中我可以使用 LoadImage 或 LoadCursor,但该 API 不适用于 UWP。我可以使用 LoadPackagedLibrary 加载 dll,但不知道如何从中获取光标。

【问题讨论】:

  • uwp 无法使用 win32 dll
  • 我可以创建一个包含资源的 UWP DLL,如果这就是您的意思吗?

标签: windows-runtime uwp


【解决方案1】:

我在 DLL 文件中嵌入了一些 .cur 文件,我想在我的 UWP C++ 项目中加载和使用它们。这有可能吗?

根据我的经验,目前是不可能的。以下是我的解释:

关于如何使用.cur文件设置自定义Cursor,之前有一些讨论:

这个article对于UWP应用来说已经过时了,但是思路是一样的:在原生资源库中定义自定义游标,使用CoreWindow.PointerCursor属性设置游标

我们需要在DLL(Universal Windows)项目中创建一个自定义光标,大部分步骤都是一样的,请看上面的CREATE A CUSTOM CURSOR部分文章

然后将现有的项目.rc文件添加到我们的C++ UWP应用程序中,使用以下代码设置自定义光标:

Windows::UI::Core::CoreCursorType cursorType = Windows::UI::Core::CoreCursorType::Custom;
CoreCursor ^* theCursor = new CoreCursor ^ (nullptr);
*theCursor = ref new CoreCursor(cursorType, 101); //101 is the resource id number
CoreWindow::GetForCurrentThread()->PointerCursor = *theCursor;

我尝试将资源文件打包成一个Windows运行时组件,虽然它已作为参考添加,但无法正确识别资源。

因此我们必须在我们的 uwp 应用程序中集成资源以满足这种特殊要求。

请查看我的示例:https://github.com/Myfreedom614/UWP-Samples/tree/master/UWPCreateCurCPPAPP1/UWPCreateCurCPPAPP1

【讨论】:

    【解决方案2】:

    您可以使用 CoreCursor API 来执行此操作:

    template <typename T>
    HRESULT RestoreCursor(T* cursorOwner, uint32_t resourceId)
    {
        using namespace ABI::Windows::UI::Core;
        using namespace Microsoft::WRL;
        using namespace Microsoft::WRL::Wrappers;
    
        ComPtr<ICoreCursorFactory> cursorFactory;
        hr = RoGetActivationFactory(HStringReference(L"Windows.UI.Core.CoreCursor").Get(), __uuidof(ICoreCursorFactory), &cursorFactory);
        if (FAILED(hr)) return hr;
    
        ComPtr<ICoreCursor> cursor;
        hr = cursorFactory->CreateCursor(CoreCursorType_Arrow, resourceId, &cursor);
        if (FAILED(hr)) return hr;
    
        return cursorOwner->put_PointerCursor(cursor.Get());
    }
    

    这里的 T 可能是 ICorePointerInputSource(如 CoreIndependentInputSource)或 ICoreWindow,这取决于您是否使用 XAML。

    我只是不是 100% 肯定您是否可以将资源包含到 DLL 中,或者它们是否必须包含在 .exe 本身中。

    【讨论】:

    • 你确定这样使用 ICoreCursorFactory 和 RoGetActivationFactory 没问题吗?我觉得这些是可以更改且可能不太便携/安全的私有 API?
    • 那些不是私有 API。它们是公开的,使用起来非常安全。事实上,这就是 C++/CX 和 .NET 在幕后所做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多