【问题标题】:DLL Import malloc Double Indirect PointersDLL 导入 malloc 双间接指针
【发布时间】:2011-05-12 15:10:18
【问题描述】:

我有一个 C 函数,它接受多个双间接指针参数。

类似的东西

int myFunction (int ** foo, int** bar, int **baz){
    int size = figureOutSizeFunction();
    *foo = (int*) malloc (sizeof(int) * size);
    return SomeOtherValue;
}

现在在 C# 中,我试图将它传递给 IntPtr,但是 IntPtr 始终为零。当我将这些值传递给下一个 DLL C 函数时,DLL 因系统访问冲突而失败。我知道代码在纯 C 环境中工作(我有一个测试代码的“main”)但是,当从 C# 调用时它不起作用

我需要在 C# 中将什么变量类型传递给 C DLL? ref ref int?

【问题讨论】:

  • 你想通过ref IntPtr然后使用Marshal.PtrToStructure读出数组。然后,您需要再次调用 DLL 才能免费调用。最后,为什么要转换 malloc() 的返回值?这很糟糕。

标签: c# c dll dllimport


【解决方案1】:

处理双指针 (**) 时,最好的方法是将它们编组为 IntPtr

public static extern int myFunction(IntPtr foo, IntPtr bar, IntPtr baz);

然后在托管代码中对双指针进行挖掘。

IntPtr foo, bar baz;
...
myFunction(foo, bar, baz); 

IntPtr oneDeep = (IntPtr)Marshal.PtrToStructure(foo, typeof(IntPtr));
int value = (int)Marshal.PtrToStructure(oneDeep, typeof(int));

上面的代码显然有点……难看。我更喜欢在IntPtr 上用漂亮的扩展方法包装它。

public static class Extensions {
  public static T Deref<T>(this IntPtr ptr) {
    return (T)Marshal.PtrToStructure(ptr, typeof(T));
  }
}

那么上面的可以改写成更易读

int value = ptr.Deref<IntPtr>().Deref<int>();

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2021-07-04
    相关资源
    最近更新 更多