我们必须处理一个遗留的 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/