gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:12 24 4
gpt4 key购买 nike

我们必须处理返回 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 方法(因为是接口(interface)实现),因此原生类型如 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方法必须是公开的并将其传递给遗留类 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() 是阻止它的好方法。客户端代码可能会因为弄乱值而使您崩溃,分发一个您存储在 map 中的简单整数是对此的一种对策。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com