如何将遗留的C++void指针传递到C++/CX类和从中传递
How to pass legacy C++ void pointers to and from a C++ /CX class?
我们必须处理从一个函数返回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();
}
}
相关文章:
- 如何创建一个windows visual Studio C++/CX NOT UWP
- 如何在 UWP C++/CX 中对象的成员函数中使用 std::thread
- C++/CX 如何从 IRandomAccessStream^ 转换为字节并返回.(UWP)
- 分配本机C++结构的 CX 公共值结构内容
- 在拥有C /CX项目时,是否可以设置calendardatePicker的默认日期
- 如何使用 C++/CX 在 UWP 应用中查找当前用户的名称?
- UWP-列表视图绑定在C /CX中的XAML上不显示
- C++/CX - 我需要从常量字符*实例化一个平台::字符串
- storagefile::在c++/cx中出现ReadAsync异常
- C++/CX - 我需要将一个 Platform::String 传递到一个接受常量字符*的方法中
- 将C++日志源代码段转换为Windows Phone C++/CX
- C++/CX 中的 [这] 是什么?(视窗 8)
- 如何使用 XAML for GUI 创建 C++(/CX ?) _DESKTOP_ Windows 8 应用程序
- C /Cx中 ^变量的含义
- 在C /CX中使用本机枚举
- FreeType "generic" 与 c++/cx 关键字冲突
- 属性通知在C /CX绑定中更改了
- 为什么我的C++/CX单元测试没有失败
- visual在源代码中是否有预定义的#define或其他方式来了解它是为C++/CX Windows运行时编译的
- Makefile:根据CC/CX/FC值更改编译器标志