将私有成员指针传递给Unmanaged Function C ++ / CLI

时间:2013-06-05 17:20:18

标签: .net pointers c++-cli wrapper

我无法将非托管指针(作为托管包装器中的成员存储)传递给需要双指针(指向存储的非托管指针的指针)的非托管函数。这个问题如下所示:

我有一个非托管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
);

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我可能错了,但你的getter会返回指针的副本

因此,当您使用&amp; ptr 时,您实际上是指向原始指针的副本,因此您将更改副本,而不是myObj实例中的原始指针。

如果您无法更改MyStructWrapper的实现,例如通过将引用返回到指针,您可能无法执行所需的操作。

等待大师们得到明确的答案......