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
wrap
Native 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));
}