【问题标题】:How to pass legacy C++ void pointers to and from a C++ /CX class?如何在 C++ /CX 类之间传递传统的 C++ void 指针?
【发布时间】:2013-12-16 17:17:30
【问题描述】:

我们必须处理从一个函数返回 void* 的遗留 C++ API (API A)。 void* 需要传递给我们的 C++ /CX API (API B),以便稍后路由回另一个具有采用 void* 参数的函数的旧版 C++ API (API C)。我们的 API B 永远不会取消对 void* 的引用,它只需要保持一段时间,然后将其原封不动地传递给 API C。

但我们找不到将void* 转换为的正确 WinRT 类型。 API B 需要公开 C++ /CX 方法(因为是接口实现),所以像 void* 这样的原生类型不能成为它的一部分。

是否有用于传输不透明指针/句柄类型的 WinRT 类型?

编辑 - 一些代码让问题更清楚:

我们从这个遗留的 C++ 类中得到一个void*

namespace A
{
    class Source
    {
    public:

        static void* GetVoidPtr();
    }
}

我们希望将void* 的 WinRT 表示传递给第二个遗留 C++ 类:

namespace C
{
    class Target
    {
    public:

        static void SetVoidPtr(void* ptr);
    }
}

在它们之间,我们有 C++ /CX 类 Router,它接收来自 Sourcevoid*Receiver,它获取 void* 的 WinRT 表示,因为 Receive 方法必须公开并将其传递给遗留类Target

namespace B
{
    public ref class Router sealed
    {
    private:

        Receiver^ m_receiver;

        void Route()
        {
            auto ptr = SOME_CAST<SOME_TYPE>(A::Source::GetVoidPtr());
            ...
            m_receiver->Receive(ptr);
        }
    }

    public interface class IReceiver
    {
        void Receive(SOME_TYPE ptr);
    }

    public ref class Receiver sealed : IReceiver
    {
    public:

        virtual void Receive(SOME_TYPE ptr)
        {
            C::Target::SetVoidPtr(SOME_CAST<void*>(ptr));
        }
    }
}

【问题讨论】:

    标签: c++ windows-runtime c++-cx


    【解决方案1】:

    你说的是一个句柄Platform::IntPtr 是便携类型。

    它们是可利用的,尽管在商店应用中通常不是一个大问题。 EncodePointer() 是阻止这种情况的好方法。客户端代码可能会通过摸索值来使您崩溃,分发一个您存储在地图中的简单整数是一种对策。

    【讨论】:

    • “你在谈论一个句柄”——确实是这样,这就是我在上面提到“不透明指针/句柄类型”的原因:)——谢谢!
    【解决方案2】:

    将 A 类更改为使用 internal: 而不是 public:。 internal 关键字将使纯 C++ 类可以访问 GetVoidPtr() 函数,但会使其无法通过 WinRT 元数据访问。

    namespace A
    {
       class Source
        {
        internal:
    
            static void* GetVoidPtr();
        }
    }
    

    【讨论】:

    • 不能这样做,因为我们需要函数在接口中,所以它必须是公共的。忘了提到必须公开的原因是界面 - 更新上面的问题。
    猜你喜欢
    • 2019-12-13
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多