Этот вопрос похож на этот пост , который я не смог использовать для решения своей проблемы. Я включил сюда некоторый код, который, надеюсь, поможет кому-то принести домой сообщение, к которому пришло другое сообщение.
Я хочу написать метод CLI / C ++, который может принимать указатель void в качестве параметра и возвращать управляемый объект (тип которого я знаю), на который он указывает. У меня есть управляемая структура:
public ref struct ManagedStruct { double a; double b;};
Метод, который я пытаюсь написать, который принимает пустой указатель на управляемую структуру в качестве параметра и возвращает структуру.
ManagedStruct^ VoidPointerToObject(void* data)
{
Object^ result = Marshal::PtrToStructure(IntPtr(data), Object::typeid);
return (ManagedStruct^)result;
}
Метод вызывается здесь:
int main(array<System::String ^> ^args)
{
// The instance of the managed type is created:
ManagedStruct^ myData = gcnew ManagedStruct();
myData->a = 1; myData->b = 2;
// Suppose there was a void pointer that pointed to this managed struct
void* voidPtr = &myData;
//A method to return the original struct from the void pointer
Object^ result = VoidPointerToObject(voidPtr);
return 0;
}
Сбой в методе VoidPointerToObject
при вызове PtrToStructure
с ошибкой: Указанная структура должна быть blittable или иметь информацию о компоновке
Я знаю, что это странно, но с такой ситуацией я сталкивался несколько раз, особенно когда неуправляемый код вызывает обратный вызов для управляемого кода и передает в качестве параметра void *.