在非托管库方法中使用托管C ++中的指针

时间:2015-11-19 23:12:28

标签: c++ .net c managed-c++

我有一个非托管C库的托管C ++包装类。我遇到了一个问题,我从托管C ++类发送的指针似乎没有指向非托管C代码库方法使用的相同内存位置。

LOCAL_STATIC_LIBRARIES

dataPointer可能没有指向C库使用的相同地址吗?或者也许我需要使用某种编组方法,或者我可能缺少的其他陷阱?

1 个答案:

答案 0 :(得分:1)

如果指针未被管理,给定您显示的代码,C函数无法对未初始化的指针执行任何操作,除了:

  1. 检查它是否为NULL,如果是,则不执行任何操作,或
  2. 使用传递的地址,发生灾难。
  3. 您正在按值传递指针,并且按值传递意味着该函数将使用传递的参数的本地副本,因此您在函数返回时看不到任何更改。该函数无法设置指针,并使这些更改以现在的方式反映给调用者。

    由于我们讨论的是C接口,您应该将C接口更改为:

    void getDataFromNonmanagedCLibrary(MyNonManagedType**);
    

    传递指向指针的指针。由于我们想要更改传递给函数的值并将其反射回调用者,因此会传递指向该值的指针。由于该值恰好是一个指针,我们传递一个指向指针的指针。

    然后重写getDataFromNonmanagedCLibrary以通过解除引用来初始化指针:

    void getDataFromNonmanagedCLibrary(MyNonManagedType** ptr)
    {
       *ptr = <the_address_you_expected_on_return>;
    }   
    

    然后在客户端:

    MyNonManagedType* dataPointer;
    getDataFromNonmanagedCLibrary(&dataPointer);
    

    请注意,指针的地址是传递的,与您希望函数通过传递变量的地址来更改非指针变量没有区别。