Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将私有成员指针传递给非托管函数C++/CLI_.net_Pointers_C++ Cli_Wrapper - Fatal编程技术网

.net 将私有成员指针传递给非托管函数C++/CLI

.net 将私有成员指针传递给非托管函数C++/CLI,.net,pointers,c++-cli,wrapper,.net,Pointers,C++ Cli,Wrapper,我无法将非托管指针(存储为托管包装中的成员)传递到需要双指针(指向存储的非托管指针的指针)的非托管函数。该问题如下所示: 我有一个非托管C结构的包装器,声明如下: public ref class MyStructWrapper { private: myStruct *_rto; public: MyStructWrapper() { _rto = new myStruct(); } // read-on

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

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


}
AlterMyStructUnmanaged的声明:

__declspec(dllexport) int AlterMyStructUnmanaged
(
    MyStruct **Object,
    otherStruct struct
);

提前感谢您的帮助

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

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

如果您无法更改MyStructRapper的实现,例如通过返回指针的引用,则可能无法执行您想要的操作


等待专家给出明确的答案……

这个问题与这个问题非常相似,但不幸的是,调用的函数是在类中定义的,因此可以直接访问指针。您能否向我们展示
AlterMyStructUnmanaged
的声明?用C函数声明更新您正在固定一个结构。这导致它被装箱到堆上。将更新装箱副本,而不是原始副本。只是不要使用pin_ptr。它不是必需的,因为它不是GC堆上可以移动的托管结构。因此,当我有一个返回指针的属性时,该属性是返回指针的副本还是指针本身?我想你可能是对的。。。这将令人失望。如果我将指针设置为公共变量,我是否能够将包装器公开到C#中?如果您使用的是不安全的代码,那么如果您可以接受它,这应该没问题。最后,我必须更改属性以访问myStruct指针以返回myStruct**。所以它看起来像属性MyStruct**Rto{MyStruct**get(){pin_ptr ptr=&_Rto;return ptr;}}谢谢大家的帮助!
__declspec(dllexport) int AlterMyStructUnmanaged
(
    MyStruct **Object,
    otherStruct struct
);