我将项目从C ++ / CX移植到C ++ / WinRT。为此,我需要执行一些互操作操作,例如:https : //docs.microsoft.com/zh-cn/windows/uwp/cpp-and-winrt-apis/interop-winrt-cx。
Microsoft建议使用此类辅助功能以实现互操作性。
from_cx和to_cx函数下面的帮助器函数将C ++ / CX对象转换为等效的C ++ / WinRT对象。该函数将C ++ / CX对象强制转换为其基础IUnknown接口指针。然后,它在该指针上调用QueryInterface,以查询C ++ / WinRT对象的默认接口。QueryInterface是Windows运行时应用程序二进制接口(ABI)的等效C ++ / CX safe_cast扩展。而且,winrt :: put_abi函数检索C ++ / WinRT对象的基础IUnknown接口指针的地址,以便可以将其设置为另一个值。
template <typename T>
T from_cx(Platform::Object^ from)
{
T to{ nullptr };
winrt::check_hresult(reinterpret_cast<::IUnknown*>(from)
->QueryInterface(winrt::guid_of<T>(),
reinterpret_cast<void**>(winrt::put_abi(to))));
return to;
}
下面的帮助器函数将C ++ / WinRT对象转换为等效的C ++ / CX对象。winrt :: get_abi函数检索指向C ++ / WinRT对象的基础IUnknown接口的指针。该函数在使用C ++ / CX safe_cast扩展名查询所请求的C ++ / CX类型之前,将该指针强制转换为C ++ / CX对象。
template <typename T>
T^ to_cx(winrt::Windows::Foundation::IUnknown const& from)
{
return safe_cast<T^>(reinterpret_cast<Platform::Object^>(winrt::get_abi(from)));
}
但是,当我做这样的事情时:
auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
Windows::UI::Xaml::FrameworkElement^ cx = to_cx<Windows::UI::Xaml::FrameworkElement^>(text);
我收到一个错误:
没有函数模板“ to_cx”的实例与参数列表匹配
参数类型为:(winrt :: Windows :: UI :: Xanl :: Controls :: TextBlock)
但是我确实看到TextBlock继承自IUnknown。我想念什么?
将winrt :: UI :: Xaml :: Controls :: TextBlock对象转换为C ++ / CX对象
如果你想端口一个C ++ / WinRT的对象到C ++ / CX对象。您可以为该解决方案制作Windows Runtime Component(C ++ / WinRT)项目,然后将转换代码放入其中。然后,使C ++ / WinRT项目引用上述组件(在解决方案资源管理器中右键单击C ++ / WinRT项目名称,单击“添加”,选择“引用”,在“添加引用”对话框的“项目”下选择刚添加的组件名称)。
注意
您需要在Windows运行时组件(C ++ / WinRT)项目而不是C ++ / WinRT项目中使用Consume Windows Runtime Extension>是(/ ZM)。
然后,在Windows运行时组件(C ++ / WinRT)中,添加cx名称空间和winrt名称空间以使用不同的语言来区分不同的对象。
可以将以下代码放入您的组件项目的类中。
添加所需的标题,例如:
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.h>
In the cx namespace, add using statements:
namespace cx
{
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
}
// And, in the winrt namespace, add the needed using statements:
namespace winrt
{
using namespace Windows;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Numerics;
using namespace Windows::UI;
using namespace Windows::UI::Core;
using namespace Windows::UI::Composition;
using namespace winrt::Windows::UI::Xaml::Controls;
using namespace winrt::Windows::UI::Xaml;
}
Add the to_cx method:
template <typename T>
T^ to_cx(winrt::Windows::Foundation::IUnknown const& from)
{
return safe_cast<T^>(reinterpret_cast<Platform::Object^>(winrt::get_abi(from)));
}
//Change the code:
/*auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
Windows::UI::Xaml::FrameworkElement^ cx = to_cx<Windows::UI::Xaml::FrameworkElement^>(text);*/
auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
cx::FrameworkElement^ cx = to_cx<cx::FrameworkElement>(text);
请不要将转换代码放入XAML页面,因为您的XAML页面类型必须完全是C ++ / CX或完全是C ++ / WinRT。您可以在同一项目中的XAML页面类型之外混合使用C ++ / CX和C ++ / WinRT。
必须首先在类的idl文件中声明在组件项目的类中使用转换代码的函数,否则我们不能在另一个项目中引用该函数。
更新:
这是我创建的一个简单示例,单击主项目中的按钮时,我调用Windows Runtime Component的方法来触发to_cx方法,可以对其进行检查。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句