c++ - 如何在 C++/CX 类之间传递旧版 C++ void 指针?

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

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

但是我们找不到正确的 WinRT 类型来转换 void*到。 API B 需要公开 C++/CX 方法(由于是接口(interface)实现),因此 native 类型如 void*不能成为其中的一部分。

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

编辑 - 一些代码以使问题更清晰:

我们得到一个void*来自这个遗留的 C++ 类:

namespace A
{
    class Source
    {
    public:

        static void* GetVoidPtr();
    }
}

我们想要传递 void* 的 WinRT 表示形式对于第二个遗留 C++ 类:

namespace C
{
    class Target
    {
    public:

        static void SetVoidPtr(void* ptr);
    }
}

在它们之间我们有 C++/CX 类 Router ,收到 void*来自Source ,和Receiver ,获取 void* 的 WinRT 表示形式自 Receive方法必须是公共(public)的,并将其传递给遗留类 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是可移植类型。

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

关于c++ - 如何在 C++/CX 类之间传递旧版 C++ void 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566518/

相关文章:

windows-phone-7 - 如何用动画在winRT中绘制弧线?

c# - SignalR:调用集线器方法 "XXX"时出错

c++ - 将 Platform::Array<byte> 转换为字符串

visual-studio - Doxygen 是否支持 C++/CX 语法?

reflection - WinRT 反射 (C++/CX)

c++ - V8 - Node C++ 插件 - 在 ConstructCall 中抛出异常导致 "FATAL ERROR: v8::ToLocalChecked Empty MaybeLocal."- 如何使构造函数失败?

c++ - 作用域枚举的最佳替代方案 - Pre C++11

c++ - 将 ofstream 传递给线程函数

c++ - 删除 char 数组似乎根本不会影响数组

windows - 从另一个 Windows 运行时应用程序检索数据