如何将遗留的C++void指针传递到C++/CX类和从中传递

How to pass legacy C++ void pointers to and from a C++ /CX class?

本文关键字:CX C++ C++void 指针      更新时间:2023-10-16

我们必须处理从一个函数返回void*的遗留C++API(API a)。该void*需要传递给我们的C++/CX API(API B),以便稍后路由回另一个具有采用void*参数的函数的传统C++API(API C)。我们的API B从未取消引用void*,它只需要保留一段时间,然后将其原样传递给API C。

但我们找不到正确的WinRT类型来强制转换void*。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,它从Source接收void*,还有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));
        }
    }
}

您谈论的是句柄。Platform::IntPtr是可移植类型。

它们是可利用的,尽管在Store应用程序中通常不是一个很大的问题。EncodePointer()是阻止这种情况的好方法。客户端代码可能会因为错误地计算值而崩溃,分发一个存储在映射中的简单整数是一种对策。

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

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