用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);
}
}
}
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);
}
}
}
解决方案 »
- C#大量相同对象winform的性能问题
- 一个线程执行后的提示问题?
- 为什么有时候给ComboBox的Text赋string值不能成功?在线等!
- string str = ""这样初始化怎么下面还会有nullReferenceException呢
- 以mm为单位画的图,不论到哪台机器上打开长度都不会改变,所以想将PictureBox的高度和宽度都设置成以mm为单位画图,如何设置呢
- c#读写流时使用using与不使用using 有什么区别?
- 关于右击二级菜单的contextMenu 控件
- c#有无模式对话框
- 关于发邮件的问题,我的代码是正确的,就是不知道怎么发布出去~~
- WebRequest WReq=WebRequest.Create()中的字符串该怎么使用?
- 高分求:请问如何在VS2005中播放Flash?急............
- 好囧,关于C#命令行参数
在项目属性 “允许不安全代码”打钩作为函数参数ref pp_name 就可以拿到pp_name的地址,可问题是pp_name以对象方式被使用,不是指针
char ***ppp 三级指针
还是用指针吧
unsafe 方法名.....
在项目属性 “允许不安全代码”打钩
就可以使用指针了
但只能在FIXED(){//使用指针的代码}里使用,离开}就不能使用指针了
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]);
}
}
//楼主,这样的调用我做过:
//加入头文件:
using System.Runtime.InteropServices;
//调用方式:(三级的道理一样)
IntPtr p = docms.DLL.oneRouteIpScanReturnIp.func(currentIp, community); //p是二级指针
IntPtr ptr = Marshal.ReadIntPtr(p); //ptr是一级指针;
string windowsLink = Marshal.PtrToStringAnsi(ptr); //获取值;
具体的,自己试吧,你能试出来的。