2010-09-05 96 views
2

Im在C#中的非托管dll函数swe_get_planet_name()上使用P/invoke。 给定函数定义,pInvoke C#DLL导入问题

char* swe_get_planet_name(int ipl, char *spname); 

这意味着返回值被分配到char * spname?它似乎是从文档中的示例代码。

char snam[40];   
/* 
* get the name of the planet p 
*/ 
swe_get_planet_name(p, snam); 
/* 
* print 
*/ 
printf(snam); 


所以我的C#代码是

[DllImport("swedll32.dll")] 
     private static extern void swe_get_planet_name(int ipl, char[] spname); 

char[] name = new char[40]; 
int p = 3; 
swe_get_planet_name(p, name); 

此执行没有错误,但是变量 '名' 被分配了一个毫无意义的 '\ 0' 在每一个项目,而不是这个星球的名字它应该返回。由于供应商提供的示例应用程序运行良好,因此无错。有任何想法吗?

+0

你试过传递一个指向字节数组而不是char []的指针吗?我相信这将会被整理成不同的形式。 – 2010-09-05 11:25:03

回答

4

它看起来是一个非常脆弱和危险的C接口,没有传递大小参数。

这里的正常模式是提供一个Stringbuilder来接收文本,并让封送处理器做它的魔术。

[DllImport("swedll32.dll")] 
private static extern void swe_get_planet_name(int ipl, StringBuilder spname); 

//char[] name = new char[40]; 
StringBuilder name1 = new StringBuilder(40); // the 40 may be usefuul, not sure 
int p = 3; 
swe_get_planet_name(p, name1); 
string name = name1.ToString(); 
+0

我同意这是一个糟糕的界面,但我不认为他可以改变它.... – 2010-09-05 11:22:44

+2

由于原始函数返回指针,最好将返回类型声明为IntPtr。 – 2010-09-05 11:37:08

+1

感谢堆家伙。 StringBuilder解决方案的作品! – 2010-09-05 12:07:21