c# 封送以空值结尾的字符串数组
c# Marshal null-terminated string array
我正在尝试导入以下内容:
const char * const *object_get_prop_names(propobject_t *ocr);
如:
[DllImport("vender.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern IntPtr object_get_prop_names(int* osr);
基于: https://limbioliong.wordpress.com/2011/08/14/returning-an-array-of-strings-from-c-to-c-part-1/
我尝试了以下方法:
var pNames = object_get_prop_names(hdl);
int StringCount = 200; //how do I know string count?
IntPtr[] pIntPtrArray = new IntPtr[StringCount];
ManagedStringArray = new string[StringCount];
Marshal.Copy(pNames, pIntPtrArray, 0, StringCount);
for (int i = 0; i < StringCount; i++)
{
ManagedStringArray[i] = Marshal.PtrToStringAnsi(pIntPtrArray[i]);
//Marshal.FreeCoTaskMem(pIntPtrArray[i]); crashes
}
//Marshal.FreeCoTaskMem(pUnmanagedStringArray); crashes
这有效,但我猜我有内存泄漏和访问我不应该的内存。
我应该如何释放内存?
我怎么知道计数?这是来自供应商的,他们不会为小我修改 dll。:)
也请原谅我深入研究了我知之甚少的事情。
遵循汉斯的建议:
var pNames = object_get_prop_names(hdl);
if (h == IntPtr.Zero)
{
return null;
}
var nameList = new List<string>();
int elementSize = Marshal.SizeOf(typeof(IntPtr));
for (int i = 0; i < 200; i++) //don't know length, pick large number
{
var ptr = Marshal.ReadIntPtr(pNames, i * elementSize);
var str = Marshal.PtrToStringAnsi(ptr);
if (!string.IsNullOrWhiteSpace(str))
{
nameList.Add(str);
}
else //end of pNames
{
break;
}
}
效果很好。我无法知道有多少个属性名称,所以我只需要选择一个比可能数量的属性名称更大的数字。
相关文章:
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组