gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:14:37 26 4
gpt4 key购买 nike

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

MyNonManagedType* dataPointer;
getDataFromNonmanagedCLibrary(dataPointer);
// this gives me junk data, where field should be a char array
String^ myFieldValue = gcnew String(dataPointer->field);

dataPointer 是否有可能指向 C 库使用的同一地址?或者也许我需要使用某种编码(marshal)方法来实现此目的,或者我可能会遗漏其他陷阱?

最佳答案

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

  1. 检查它是否为 NULL,如果是,则不对其执行任何操作,或者
  2. 使用传递的地址,灾难就会发生。

您正在按值传递指针,按值传递意味着函数将使用所传递参数的本地拷贝,因此当函数返回时您看不到任何变化。该函数无法设置指针并使这些更改按现在的方式反射(reflect)给调用者。

由于我们正在讨论 C 接口(interface),因此您应该将 C 接口(interface)更改为:

void getDataFromNonmanagedCLibrary(MyNonManagedType**);

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

然后重写 getDataFromNonmanagedCLibrary 通过取消引用来初始化指针:

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

然后在客户端:

MyNonManagedType* dataPointer;
getDataFromNonmanagedCLibrary(&dataPointer);

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

关于c++ - 在非托管库方法中使用托管 C++ 中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com