【问题标题】:how to access char*** from dll import in C#如何从 C# 中的 dll 导入中访问 c​​har***
【发布时间】:2010-03-27 13:43:01
【问题描述】:

我在 win32 dll 中有一个函数,签名为:

void func1(int a, char*** outData)

int a --> 输入参数
char*** outData --> 输出参数 - 指向 char 字符串数组的指针


知道如何在 C# 中使用 dll 导入和签名来访问它。

【问题讨论】:

    标签: c# dll dllimport


    【解决方案1】:

    对于像三指针这样的复杂类型,我发现最好的方法是简单化并将其编组为 IntPtr

    [DllImport("Some.dll")]
    private static extern void func1(int a, out IntPtr ptr)
    

    一旦此函数返回 IntPtr 值将实质上表示 char**

    使用该值几乎是不可能的,因为我们不知道长度。您需要更改函数签名以传回数组的长度,然后才能在托管代码中使用它。

    【讨论】:

    • char* 数组可能以 NULL 指针终止,而不是显式存储长度。
    • 你能以任何方式使用StringBuilder吗,通常是你可以作为参数传入的?
    • @Mikael:StringBuilder 不能处理多个字符串。
    • Marshal 类将允许您从该 char* 数组中检索原始 char*,然后将每个有效的 char* 转换为字符串。这可能很复杂,但我认为我不会同意“几乎不可能”。
    • 您好,很抱歉回复晚了。不太好。现在解决问题。假设我更改函数签名以返回长度。 void func1(int a, char*** outData, int* len) 那么我在 C# 中的签名将是: DllImport("Some.dll")] private static extern void func1(int a, out IntPtr ptr, out int len)现在我如何使用这个 IntPtr 来获取值。你能给我一些代码 sn-p 吗?很抱歉直接询问代码 sn-p,但我的问题是我是 C# 的新手和这个奇怪的问题。感谢您的帮助。
    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多