用C#调用C写的DLL库遇到一个问题,希望高手能解答
C库里的一个函数:void get_name_list( char ***ppp,int *num);通过这个函数取得所有人的名称,每个人的名称地址放在二级指针数组里,即*pp为首址的空间里
调用这个函数的方法如下:
void CallGetNameList(void)
{
   char **pp_name;
   int num;
   get_name_list(&pp_name,&num);
   if( num <= 0 )
      return;
   for( int i=0;i<num;i++ )
   {
     printf("%s\n",pp_name[i]);
   }
}在C#里通过DLL调用这个函数,最大问题是不知道如何取得二级指针(上面的pp_name)的地址,在C里是可以用&取得二级指针pp_name的地址然后作为三级指针传给get_name_list;
C#的代码如下:
namespace
{
private class namelist

 CallGetNameList(void)
{
   IntPtr pp_name = new IntPtr();
   /*其他代码省略,最关键的是如何知道pp_name的地址?请朋友指教*/
   int num;
   get_name_list( pp_name,ref num);
}
}
}

解决方案 »

  1.   

    unsafe 方法名.....
    在项目属性 “允许不安全代码”打钩作为函数参数ref pp_name 就可以拿到pp_name的地址,可问题是pp_name以对象方式被使用,不是指针
     char ***ppp 三级指针
    还是用指针吧
    unsafe 方法名.....
    在项目属性 “允许不安全代码”打钩
    就可以使用指针了
    但只能在FIXED(){//使用指针的代码}里使用,离开}就不能使用指针了
      

  2.   

    C#当然有指针.
            static void Main(string[] args)
            {
                unsafe
                {
                    int x = 0;
                    int* pi = &x;
                    Console.WriteLine(*pi);
                    int* array=stackalloc int[10];
                    for (int i = 0; i != 10; ++i)
                        *(array + i) = i;
                    for (int i = 0; i != 10; ++i)
                        Console.WriteLine(array[i]);
                }
            }
      

  3.   

    多谢各位关注,在发贴的时候没有写上前提:不用unsafe,而是用Mashal处理非托管与托管区代码,也即是说C写的DLL里的指针,一级指针也好,二级指针也好,三级指针也好,全部用IntPtr表示
      

  4.   

    用 out 关键字,事实上调用API及DLL函数还是需要指针概念的
      

  5.   


    //楼主,这样的调用我做过:
    //加入头文件:
    using System.Runtime.InteropServices;
    //调用方式:(三级的道理一样)
     IntPtr p = docms.DLL.oneRouteIpScanReturnIp.func(currentIp, community); //p是二级指针
                        IntPtr ptr = Marshal.ReadIntPtr(p);                   //ptr是一级指针;
                        string windowsLink = Marshal.PtrToStringAnsi(ptr);      //获取值;
      

  6.   

    程序员如果很清楚DLL那个函数的定义,即知道哪里用了malloc,内在泄漏是可以避免的
      

  7.   

    程序员如果很清楚DLL那个函数的定义,即知道哪里用了malloc,内在泄漏是可以避免的
      

  8.   

    二级指针调用我已经做出来,没有什么问题,因为二级指针的变量地址也是二级指针的首地址,用Marshal.ReadIntPtr可以直接读取以它为首地址的指针数组,然后对指针数组的每个值调用Marshal.PtrToStringAnsi(ptr)就得到最终的字串值,但三级指针不行,测试很多次都失败,在纯C中直接接定义三级指针传入也是不能获取字串值的,一定要传入二级指针的地址才行....实在解决不了,我就用unsafe了
      

  9.   

    二级指针的话,用Marshal的话,使用LPtr,传上来表示成为一个string[]型的数据就可以了。注意要Marshal声明该string[]中每一个元素,SubType域需要指定。
    具体的,自己试吧,你能试出来的。