c#封送以null结尾的字符串数组
我正在尝试导入以下内容:c#封送以null结尾的字符串数组,c#,c++,marshalling,dllimport,C#,C++,Marshalling,Dllimport,我正在尝试导入以下内容: const char * const *object_get_prop_names(propobject_t *ocr); var pNames = object_get_prop_names(hdl); int StringCount = 200; //how do I know string count? IntPtr[] pIntPtrArray = new IntPtr[StringCount]; ManagedStringArray = new stri
const char * const *object_get_prop_names(propobject_t *ocr);
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
作为:
基于:
我尝试了以下方法:
const char * const *object_get_prop_names(propobject_t *ocr);
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
var pNames=object\u get\u prop\u name(hdl);
int StringCount=200//我怎么知道字符串数?
IntPtr[]pIntPtrArray=新的IntPtr[StringCount];
ManagedStringArray=新字符串[StringCount];
封送处理副本(pNames,pIntPtrArray,0,StringCount);
对于(int i=0;i
这是可行的,但我猜我有内存泄漏,访问内存我不应该
我应该如何释放内存
我怎么知道伯爵?这是供应商提供的,他们不会为little ol'me修改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;
}
}
var pNames=object\u get\u prop\u name(hdl);
if(h==IntPtr.Zero)
{
返回null;
}
var nameList=新列表();
int elementSize=Marshal.SizeOf(typeof(IntPtr));
对于(int i=0;i<200;i++)//不知道长度,请选择大数字
{
var ptr=Marshal.ReadIntPtr(pNames,i*elementSize);
var str=Marshal.PtrToStringAnsi(ptr);
如果(!string.IsNullOrWhiteSpace(str))
{
姓名列表。添加(str);
}
else//pNames的结尾
{
打破
}
}
效果很好。我无法知道有多少财产名称,因此我只能选择一个比可能的财产名称数量大的数字。遵循Hans的建议:
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;
}
}
var pNames=object\u get\u prop\u name(hdl);
if(h==IntPtr.Zero)
{
返回null;
}
var nameList=新列表();
int elementSize=Marshal.SizeOf(typeof(IntPtr));
对于(int i=0;i<200;i++)//不知道长度,请选择大数字
{
var ptr=Marshal.ReadIntPtr(pNames,i*elementSize);
var str=Marshal.PtrToStringAnsi(ptr);
如果(!string.IsNullOrWhiteSpace(str))
{
姓名列表。添加(str);
}
else//pNames的结尾
{
打破
}
}
效果很好。我无法知道有多少个属性名,因此只能选择一个比可能的属性名数大的数字。它返回const char*,因此没有太多理由担心释放字符串。一定有办法找出有多少个字符串。我会查找IntPtr.Zero或空字符串。在您知道对每个元素使用Marshal.ReadIntPtr()之前,您无法安全地使用Marshal.Copy(),每次都要按IntPtr.Size递增pNames。@Hans这是有效的!我一直读到得到空值。你能写出解决方案吗?这样我就可以给你评分了?它返回const char*,所以没有太多理由担心释放字符串。一定有办法找出有多少个字符串。我会查找IntPtr.Zero或空字符串。在您知道对每个元素使用Marshal.ReadIntPtr()之前,您无法安全地使用Marshal.Copy(),每次都要按IntPtr.Size递增pNames。@Hans这是有效的!我一直读到得到空值。你能把答案写出来让我给你评分吗?