我需要以下帮助。我有一个 c++ API(无法访问源代码),我正在努力处理返回 char* 属性或返回包含 char* 属性的结构的方法。根据 API 的文档,返回值如下:
返回值
如果函数成功,则返回值是指向一系列以空字符结尾的字符串的指针,主机系统上的每个项目都有一个,以第二个空字符结尾。以下示例显示了缓冲区内容,<null>
表示终止空字符:
project1<null>project2<null>project3<null><null>
如果函数失败,返回值为NULL
我遇到的问题是 C# 中返回的指针仅包含第一个值... project1 在这种情况下。如何获得完整列表以便能够在托管端循环访问它们?
这是c#代码:
[DllImport("vmdsapi.dll", EntryPoint = "DSGetProjectList", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr DSGetProjectList();
调用方法:
IntPtr ptrProjectList = DSAPI.DSGetProjectList(); string strProjectList = Marshal.PtrToStringAnsi(ptrProjectList).ToString();
strProjectList 仅包含第一项。
这是API头文件中的信息......
DllImport char *DSGetProjectList dsproto((void));
这是我用于测试目的的 c++ 控制台应用程序的一些示例代码...
char *a; a = DSGetProjectList( ); while( *a ) { printf("a=%s\n", a); a += 1 + strlen(a); }
每次迭代都会正确显示列表中的每个项目。