【发布时间】:2013-06-06 05:42:12
【问题描述】:
我无法将非托管指针(存储为托管包装器中的成员)传递给需要双指针(指向存储的非托管指针的指针)的非托管函数。这个问题如下图所示:
我有一个非托管 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
);
提前感谢您的帮助!
【问题讨论】:
-
这个问题和stackoverflow.com/questions/569690/…这个问题很相似,但不幸的是,调用的函数是在类中定义的,因此可以直接访问指针。
-
你能告诉我们
AlterMyStructUnmanaged的声明吗? -
更新了 C 函数声明
-
您正在固定一个结构。这导致它被装箱在堆上。盒装副本将被更新,而不是原件。只是不要使用 pin_ptr。它不是必需的,因为它不是 GC 堆上可以移动的托管结构。
-
那么当我有一个返回指针的属性时,该属性是返回指针的副本还是指针本身?
标签: .net pointers c++-cli wrapper