Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#封送以null结尾的字符串数组_C#_C++_Marshalling_Dllimport - Fatal编程技术网

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这是有效的!我一直读到得到空值。你能把答案写出来让我给你评分吗?