- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 C++ 和 WRL 创建一个 WinRT 组件(Windows 运行时 C++ 模板库)可通过 C# 静态方法调用在托管代码中使用。
int sum = Math.FastAdd(5,6);
下面是对我不起作用的实现。
这里有什么问题吗?
import "inspectable.idl"; #define COMPONENT_VERSION 1.0 namespace WRLNativeComponent { runtimeclass Math; [uuid(EFA9D613-BA8F-4F61-B9E7-C6BE7B7765DD)] [exclusiveto(WRLNativeComponent.Math)] [version(COMPONENT_VERSION)] interface IMathStatics : IInspectable { HRESULT FastAdd([in] int a, [in] int b, [out, retval] int* value); } [uuid(650438BA-C401-49E1-8F06-58DCD5A4B685), version(COMPONENT_VERSION)] interface IMath : IInspectable { HRESULT InstanceMethod(void); } [static(WRLNativeComponent.IMathStatics, COMPONENT_VERSION)] [version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)] runtimeclass Math { [default] interface IMath; } }
#pragma once #include <wrl.h> #include "MyMath_h.h" // generated from IDL using namespace Microsoft::WRL; namespace WRLNativeComponent { class Math : public Microsoft::WRL::RuntimeClass, ABI::WRLNativeComponent::IMath> { InspectableClass(RuntimeClass_WRLNativeComponent_Math, BaseTrust); public: Math(void) {} ~Math(void) {} STDMETHODIMP InstanceMethod() override { return S_OK; } }; class MathStatics : public Microsoft::WRL::ActivationFactory { InspectableClassStatic(InterfaceName_WRLNativeComponent_IMathStatics, BaseTrust); public: MathStatics(void) {} ~MathStatics(void) {} STDMETHODIMP FastAdd(_In_ int a, _In_ int b, _Out_ int* value) override { if (value == nullptr) return E_POINTER; *value = a + b; return S_OK; } }; ActivatableClass(Math); ActivatableStaticOnlyFactory(MathStatics); }
编译后创建 WRLNativeComponent.winmd 文件。我可以使用 public static FastAdd 方法看到 Math 类。
构建C#客户端调用静态方法。进行调用时,将抛出 'System.InvalidCastException'。这预计会正常工作。
最佳答案
一个运行时类最多可以有一个激活工厂。每次使用一个 Activatable
宏为运行时类型注册一个激活工厂。因此,您的库中的以下代码
ActivatableClass(Math);
ActivatableStaticOnlyFactory(MathStatics);
尝试注册两个激活工厂:第一个为 Math
注册一个简单的激活工厂。类,第二个注册了另一个实际上不可用的简单激活工厂(我们稍后会看到原因)。
因为第一个简单激活工厂与 Math
相关联类,它在 C# 组件尝试调用静态成员函数时返回。然后 C# 组件尝试将此接口(interface)指针转换为 IMathStatics
接口(interface),简单激活工厂没有实现,所以转换失败,你得到 InvalidCastException
.
由于给定的运行时类只能有一个激活工厂,因此您的 MathStatics
类需要同时实现 IMathStatics
静态成员接口(interface)和 IActivationFactory
接口(interface),用于默认构造(这是必需的,因为您使用不带工厂接口(interface)名称的 Math
属性将 activatable
类型声明为默认可构造类型)。
您的激活工厂需要像这样实现:
class MathStatics : public ActivationFactory<IMathStatics>
{
InspectableClassStatic(RuntimeClass_WRLNativeComponent_Math, BaseTrust);
public:
MathStatics() {}
~MathStatics() {}
STDMETHODIMP ActivateInstance(_Outptr_result_nullonfailure_ IInspectable** ppvObject) override
{
return MakeAndInitialize<Math>(ppvObject);
}
STDMETHODIMP FastAdd(_In_ int a, _In_ int b, _Out_ int* value) override
{
if (value == nullptr) return E_POINTER;
*value = a + b;
return S_OK;
}
};
ActivatableClassWithFactory(Math, MathStatics);
ActivationFactory
基类模板提供了 IActivationFactory
的默认实现界面。此默认实现仅返回 E_NOTIMPL
当客户端尝试默认构造 Math
的实例时类型,因此我们需要覆盖此成员函数以实际默认构造一个 Math
对象。
请注意,在使用 InspectableClassStatic
时完成IInspectable
的实现对于激活工厂,类名应该是运行时类的名称(在本例中为 RuntimeClass_WRLNativeComponent_Math
),而不是静态接口(interface)的名称。激活是按类型名称执行的,WRL 基础结构使用此名称来使用其名称查找运行时类型的激活工厂。
ActivatableClassWithFactory
用于向关联的激活工厂注册运行时类。
关于c++ - 在 C++/WRL 中使用静态方法创建 WinRT 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12563327/
我在映射顶点缓冲区时遇到问题。当我这样做时: ID3D11Buffer* pD3DSingleVertexBuffer; ... pD3DImmediateContext->Map(pD3DSingl
我需要遍历从 Windows::ApplicationModel::Store::LicenseInformation 获得的 IMapView .它应该与标准 for_each 一起使用,我不能使用
我正在尝试将 SpatialSurfaceObserver 类用于 Windows Mixed Reality。我在关注这个:https://developer.microsoft.com/en-us
背景(或者,看看我自己走了多远!) 我从 Windows 8 Media Extension Sample 开始.我使用灰度示例作为起点来学习如何将值从托管代码传递到 COM 对象,以及如何将值从我的
我尝试使用 WRL 并坚持使用集合。 我需要传递函数附加属性: ABI::Windows::Devices::Enumeration::IDeviceInformationStatics::FindA
我有一个类 ClassA 实现接口(interface) IFooBar 如下所示 class ClassA : public Microsoft::WRL::RuntimeClass { publi
我目前正致力于将 Boost“文件系统”库移植到 Windows Phone 8.1。通过用其他更新的非禁止函数替换“被禁止的”Win32 API 函数,我成功地移植了大约一半的有问题的函数。 我现在
我需要从 WRL 导入并显示 3D 模型Android 应用程序中的文件。到目前为止,我还没有找到任何 API 示例或第 3 方库来帮助解决这个问题。有什么想法(除了转换为另一种 3D 文件格式之外)
我可以使用 C++ 中的 WRL 库代替 ATL 来编写 COM 组件吗?如果可以,我能否在 Windows XP 等较旧的桌面 Windows 系统上使用它? 我很确定第一个问题的答案是肯定的,因为
当我使用 WRL 创建 winrt 组件时,问题是我只能使用 ABI::Windows::xxx 命名空间,而不能使用 Windows::UI::Xaml WRL 中的::Media::Imaging
我正在尝试调用 IStoreProduct 的 get_Skus() 方法来检索它的 Skus属性使用C++/WRL (不是 C++/CX)而且我找不到任何合适的代码示例。该方法是这样定义的(正如我从
我想使用 C++ 和 WRL 创建一个 WinRT 组件(Windows 运行时 C++ 模板库)可通过 C# 静态方法调用在托管代码中使用。 int sum = Math.FastAdd(5,6);
我想使用 WRL 编写具有异步支持的 WinRT 组件,但我发现 create_async() 未定义,即使我包含了 ppltask.h 和 使用命名空间并发如何使用 WRL 模式创建后台任务? 我的
在 C++/CX 中订阅事件是这样的: listener::ConnectionReceived += ref new TypedEventHandler(this, &MyClass::OnConn
我有 VRML(*.wrl) 文件,我想在我的 iOS 应用程序中打开该文件。有什么办法可以做到这一点,即任何 SDK 或其他方式。提前致谢 最佳答案 Cortona3D是一个非常好的 .wrl 文件
我正在尝试获取引用特定 USB 设备的 Windows::Devices::Usb::UsbDevice 对象,以便将其传递给第 3 方插件。由于项目限制,我无法使用 C++/CX 扩展。 在查看了无
我一直在我的代码中反复使用 ComPtr,因为我到处都需要它们,但我一直这样做: HRESULT Material::Initialize(aiMaterial* pMaterial,
我已经按照这里的例子:http://msdn.microsoft.com/en-us/library/vstudio/jj822931.aspx使用 Windows 运行时模板库 (WRL) 创建进程
我正在尝试使用 Three.js 加载 VRML 模型,但我的代码似乎无法正常工作,并且无法在网页上显示 3D 模型。我的代码有问题吗? var loader = new THREE.VRMLLoad
我正在尝试关注 these steps on MSDN用于构建基于 WRL 的 C++ WinRT 组件。但是在第 3 步中,我无法在结果中找到与 WRL 相关的任何内容: 在右上角的“搜索在线模板”
我是一名优秀的程序员,十分优秀!