Я делаю оболочку времени выполнения 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
(не C++) как Windows Runtime Component
. Native c имеет много функций обратного вызова, которые объявлены следующим образом:
Например,
//declare in native c
typedef int (GetData*)(void *, char* arg1, size_t arg2);
void *
— это указатель на экземпляр объекта.
и обратный вызов будет выполняться в машинном коде c во время выполнения.
Мы ожидаем, что Application(C#/C++CX ...) реализует этот метод.
Оболочка WinRT (C++/CX)
моя идея заключается в следующем,
(1) Предоставьте interface
приложению
// XRtWrapperNamespace
public interface class XWinRtDataWrapper
{
//declare in base class
void getData(IVector<byte> ^ data);
}
чтобы позволить приложению реализовать функцию. Поскольку я не могу экспортировать собственный тип данных, я предоставляю IVector
для получения данных из приложения.
(2) Объявите глобальную функцию обратного вызова для преобразования IVector<byte>^
в собственный тип данных char *
, как показано ниже:
// 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 *
// ...
}
Мой вопрос
Как сохранить ссылку на объект Windows на собственный C? Это выглядит невозможным, но есть ли какое-нибудь решение для этого?
Приложение (пример)
//Application
public ref class XAppData: public XWinRtDataWrapper
{
public:
virtual void getData(IVector<byte> ^ data)
{
//implementation here
}
}