アンマネージ ポインター (マネージ ラッパーにメンバーとして格納されている) を、ダブル ポインター (格納されているアンマネージ ポインターへのポインター) を必要とするアンマネージ関数に渡すのに問題があります。この問題を以下に示します。
以下に宣言されたアンマネージ C 構造体のラッパーがあります。
public ref class MyStructWrapper
{
private:
myStruct *_rto;
public:
MyStructWrapper()
{
_rto = new myStruct();
}
// read-only property
public property RTO{
myStruct * get(){return _rto;}
}
}
C Dll から関数を呼び出す必要があります。
// alters data based on data in "SomeotherStructWrapper"(which consequently holds a
// SomeOtherStruct* ).
int SomeOtherStructWrapper::AlterMyStruct(myStructWrapper^ myObj)
{
// unmanaged function in C DLL
pin_ptr<myStruct> ptr = myObj->RTO;
AlterMyStructUnmanaged(&ptr,&someOtherStructStoredMemberPtr);
}
目標は、myObj->RTO が指すデータを変更することです...残念ながら、これはコンパイルして実行し、ptr の背後にあるデータを変更しますが、myObj で変更する必要がある実際のデータはそうではありません。
編集:
これは SomeOtherStructWrapper の実装です:
public ref class SomeOtherStructWrapper
{
private:
otherStruct *_ots;
public:
MyStructWrapper()
{
_ots = new otherStruct();
}
int AlterMyStruct(MyStructWrapper ^rto);
}
}
AlterMyStructUnmanaged の宣言:
__declspec(dllexport) int AlterMyStructUnmanaged
(
MyStruct **Object,
otherStruct struct
);
助けてくれてありがとう!