.net 将私有成员指针传递给非托管函数C++/CLI
我无法将非托管指针(存储为托管包装中的成员)传递到需要双指针(指向存储的非托管指针的指针)的非托管函数。该问题如下所示: 我有一个非托管C结构的包装器,声明如下:.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
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
);