Windows phone 8.1 我如何铸造C++/CX运行时对象是否为本机C指针类型?
我正在做一个Windows phone 8.1 我如何铸造C++/CX运行时对象是否为本机C指针类型?,windows-phone-8.1,c++-cx,Windows Phone 8.1,C++ Cx,我正在做一个C++/CX运行时包装器,我需要将C++/CX对象指针传递到本机C。我如何做,并将本机指针转换回C++/CX对象引用类型 void XClassA::do(XClass ^ B) { void * ptr = (void*)(B); // how to convert it? } 而且,C++/CX使用引用计数,如果我将对象引用转换为本机指针,我如何管理指针生命周期 更新(来自@Hans Passant的请求) 问题的背景 天然C 我试图使用C++/CXwrapNat
C++/CX
运行时包装器,我需要将C++/CX
对象指针传递到本机C。我如何做,并将本机指针转换回C++/CX
对象引用类型
void XClassA::do(XClass ^ B)
{
void * ptr = (void*)(B); // how to convert it?
}
而且,C++/CX
使用引用计数,如果我将对象引用转换为本机指针,我如何管理指针生命周期
更新(来自@Hans Passant的请求) 问题的背景 天然C 我试图使用
C++/CX
wrapNative C
library(不是C++)作为Windows运行时组件
。本机c有许多回调函数,声明如下:
比如说,
//declare in native c
typedef int (GetData*)(void *, char* arg1, size_t arg2);
void*
是指向对象实例的指针。在运行时,回调将在本机c中执行。
我们希望应用程序(C#/C++CX…)实现该方法 WinRT包装器(C++/CX) 我的想法是,
// when Native C executes callback function,
// it will forward in the method in C++/CX.
// The method calls the implementation method via object pointer.
// (And here is my my question)
void XRtWrapperNamespace::callbackWrapper(void * ptr, char *, int length)
{
// create Vector to save "out" data
auto data = ref new Vector<byte>();
// I expect I could call the implementation from Application.
ptr->getData(data); // bad example.
// convert IVector data to char *
// ...
}
(1) 向应用程序提供接口
// XRtWrapperNamespace
public interface class XWinRtDataWrapper
{
//declare in base class
void getData(IVector<byte> ^ data);
}
我的问题是
如何将windows对象引用保留到本机C?
这看起来不可能,但有什么解决办法吗
应用程序(示例)
//应用程序
public ref类XAppData:public XWinRtDataWrapper
{
公众:
虚拟void getData(IVector^data)
{
//在这里实现
}
}
您的思路不对。我假设您在组件中包含一个c头:
extern "C" {
#include "native.h"
}
此标题包含:
typedef int (* GetData)(void* buffer, int buflen);
void initialize(GetData callback);
其中必须调用initialize()函数来初始化C代码,设置回调函数指针。您希望客户机代码直接写入分配大小为buflen的缓冲区。某种类型的错误指示将是有用的,并且允许客户机代码指定它实际写入缓冲区的字节数。因此int返回值
WinRT中函数指针的等价物是委托。因此,您需要声明一个与功能中的C函数指针匹配的函数。在.cpp文件中写入:
using namespace Platform;
namespace YourNamespace {
public delegate int GetDataDelegate(WriteOnlyArray<byte>^ buffer);
// More here...
}
类构造函数需要初始化C代码:
MyComponent::MyComponent() {
initialize(GetDataImpl);
}
我们需要一个使C回调引发事件的小适配器方法,以便客户端代码可以填充缓冲区:
int MyComponent::GetDataImpl(void* buffer, int buflen) {
return GetData(ArrayReference<byte>((byte*)buffer, buflen));
}
int MyComponent::GetDataImpl(void*buffer,int buflen){
返回GetData(ArrayReference((byte*)缓冲区,buflen));
}
这是一个毫无意义的问题,你永远也找不到指向该对象的指针。它位于完全不同的运行时中,可以用Javascript或.NET语言实现。您只能使用接口指针。每个WinRT对象都实现IInspectable,因此您可以获取指向该对象的指针,并在必要时强制转换为void*。但是迟早你会不得不回溯并调用Release(),所以这一次的转换没有多大意义。如果你不解释为什么你认为你需要这样做,你就不会得到一个好的答案。非常感谢。由于特殊要求,我必须允许每个实例都有自己的回调函数实现。这可能吗?您必须修改您的C代码以支持某种实例。也许你需要一个句柄或一个简单的指针,你的问题中没有任何东西可以建议最好的方法。在ref类中存储这样的句柄当然非常简单。如果您需要有关c代码的帮助,请单击“询问问题”按钮并使用[c]标记。好的,我理解您的意思,让我尝试一下实现。非常感谢。
MyComponent::MyComponent() {
initialize(GetDataImpl);
}
int MyComponent::GetDataImpl(void* buffer, int buflen) {
return GetData(ArrayReference<byte>((byte*)buffer, buflen));
}