수정 : 수정 된 답변은 아래를 참조하십시오.
정말 당신은 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에 의해 업데이트 됨)를 관리 객체에 다시 복사합니다. 관리되는 개체는 관리되는 힙에 있으므로 컴파일러는 가비지 수집기가 실행될 때 해당 개체에 포함 된 포인터에 대한 참조를 전달할 수 없도록합니다.