【问题标题】:Passing private member pointer to Unmanaged Function C++/CLI将私有成员指针传递给非托管函数 C++/CLI
【发布时间】: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


【解决方案1】:

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

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

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

等待大师给出明确的答案...

【讨论】:

  • 我认为你可能是对的......这会令人失望。如果我将指针设为公共变量,我能否将包装器公开到 C# 中?
  • 如果你使用了不安全的代码,如果你能接受的话应该没问题。
  • 最后,我不得不更改属性以访问 myStruct 指针以返回 myStruct**。所以它看起来像属性 MyStruct** Rto { MyStruct** get(){pin_ptr ptr = &_rto; return ptr;} } 感谢大家的帮助!
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多