我无法将非托管指针(作为托管包装器中的成员存储)传递给需要双指针(指向存储的非托管指针的指针)的非托管函数。这个问题如下所示:
我有一个非托管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-&gt; 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
);
提前感谢您的帮助!
答案 0 :(得分:0)
我可能错了,但你的getter会返回指针的副本。
因此,当您使用&amp; ptr 时,您实际上是指向原始指针的副本,因此您将更改副本,而不是myObj实例中的原始指针。
如果您无法更改MyStructWrapper的实现,例如通过将引用返回到指针,您可能无法执行所需的操作。
等待大师们得到明确的答案......