0

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

我有一个下面声明的非托管 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
);

在此先感谢您的帮助!

4

1 回答 1

0

我可能是错的,但你的吸气剂返回指针的副本

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

如果您无法更改 MyStructWrapper 的实现,例如通过返回对指针的引用,您可能无法做您想做的事情。

坐等高手给个明确的答案...

于 2013-06-05T20:21:07.297 回答