2010-09-05 118 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