EDIT:下記を参照してください。
本当にあなたは、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によって更新された)を管理対象オブジェクトにコピーします。マネージオブジェクトは管理されたヒープ上にあるため、ガベージコレクタの実行時に移動する可能性があるため、コンパイラはそのオブジェクトに含まれるポインタへの参照を渡すことはできません。