根据WinRT规范,私有类应覆盖IInspectable::GetRuntimeClassName()并返回不同的名称(或NULL)。但是由于IInspectable不是ref类(它是一个结构),所以我不能从它继承或重写这些方法。

从MSDN定义:

HRESULT GetRuntimeClassName(
  [out]  HSTRING *className
);


所以问题是,如何为WinRT(ref)类覆盖IInspectable::GetRuntimeClassName()

尝试示例:

#include "Hstring.h"
#include "Inspectable.h"
#include <sal.h>

namespace PhoneVoIPApp
{
    namespace BackEnd
    {
        namespace CallController
        {
            public interface class IHelloWorld
            {
                Platform::String^ SayHello();
            };

            private ref class HelloWorldImpl sealed :IHelloWorld
            {
            public:
                virtual Platform::String^ SayHello();

                virtual HRESULT GetRuntimeClassName(_Out_ HSTRING *className) override;
            };

            Platform::String^ HelloWorldImpl::SayHello()
            {
                return L"Hello World!";
            }

            HRESULT HelloWorldImpl::GetRuntimeClassName(_Out_ HSTRING *className)
            {
                *className = nullptr;

                return E_NOTIMPL;
            }
        }
    }
}

最佳答案

我与CLR小组进行了交谈,他们为我指出了正确的答案。

使用私有类时,可以将秘密的未记录属性Platform::Metadata::RuntimeClassName添加到代码中。

因此,解决该问题的方法是:

#include "Hstring.h"
#include "Inspectable.h"
#include <sal.h>

namespace PhoneVoIPApp
{
    namespace BackEnd
    {
        namespace CallController
        {
            public interface class IHelloWorld
            {
                Platform::String^ SayHello();
            };

            private ref class HelloWorldImpl sealed : [Platform::Metadata::RuntimeClassName]IHelloWorld
            {
            public:
                virtual Platform::String^ SayHello();
            };

            Platform::String^ HelloWorldImpl::SayHello()
            {
                return L"Hello World!";
            }
        }
    }
}

关于c++ - 如何为WinRT(ref)类覆盖IInspectable::GetRuntimeClassName(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21309802/

10-11 01:53