编辑:固定答案,见下文。
你真的需要知道 oldFunction 将用 pStuff 做什么。如果 pStuff 是指向某些非托管数据的指针,您可以尝试将 m_pStuff 的定义包装为:
#pragma unmanaged
void* m_pStuff
#pragma managed
这将使指针成为非托管指针,然后可以将其传递给非托管函数。当然,您将无法直接将任何托管对象分配给此指针。
从根本上说,非托管和托管指针是不一样的,如果没有某种复制底层数据的胶水代码,就无法进行转换。基本上托管指针指向托管堆,由于这是垃圾收集,它们指向的实际内存地址会随着时间而改变。如果您没有明确地这样做,非托管指针不会更改内存地址。
从头开始,您不能在类定义中定义非托管/托管。但是这个测试代码似乎工作得很好:
// TestSol.cpp : main project file.
#include "stdafx.h"
using namespace System;
#pragma unmanaged
void oldFunction(void** pStuff)
{
return;
}
#pragma managed
ref class Test
{
public:
void* m_test;
};
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
Test^ test = gcnew Test();
void* pStuff = test->m_test;
oldFunction(&pStuff);
test->m_test = pStuff;
return 0;
}
在这里,我首先将指针从托管对象中复制出来,然后将其传递给 oldFunction。然后我将结果(可能由 oldFunction 更新)复制回托管对象。由于托管对象位于托管堆上,因此编译器不会让您传递对该对象中包含的指针的引用,因为它可能会在垃圾收集器运行时移动。