在C#中将IntPtr转换为char **

时间:2015-05-25 09:08:53

标签: c# memory-management types type-conversion dllimport

我想解释以下非托管函数的输出:

afc_error_t afc_get_device_info (afc_client_t client, char ***device_information)

我使用代码导入dll:

[DllImport("libimobiledevice.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern short afc_get_device_info(IntPtr client, out IntPtr info);

只要我只需要将响应转换为字符串Marshal.PtrToStringAnsi就可以了。但是我不知道如何将IntPtr转换回char数组。

1 个答案:

答案 0 :(得分:2)

应该是这样的:

IntPtr di;

int result = afc_read_directory(client, @"C:\", out di);

if (di == IntPtr.Zero)
{
    throw new Exception();
}

IntPtr di2 = di;

while (true)
{
    IntPtr ptr = Marshal.ReadIntPtr(di2);

    if (ptr == IntPtr.Zero)
    {
        break;
    }

    string str = Marshal.PtrToStringAnsi(ptr);

    if (str == string.Empty)
    {
        break;
    }

    di2 = di2 + IntPtr.Size;
}

尝试它是否有效,然后我将解释如何......

重要你在这里泄漏记忆......

我在C中找到了这个例子:

char **dirs = NULL;
afc_read_directory(afc, "/eafaedf", &dirs);
if (!dirs)
    afc_read_directory(afc, "/", &dirs);
printf("Directory time.\n");
for (i = 0; dirs[i]; i++) {
    printf("/%s\n", dirs[i]);
    free(dirs[i]);
}
if (dirs)
    free(dirs);

负责释放内存(请参阅周期内的free和最终的免费?)。在这种情况下(对于返回C字符串数组的其他方法,您可以使用afc_dictionary_free。请注意,其他方法如afc_receive_data返回单个内存块,您无法使用它。