2013-10-14 57 views
1

我想在使用DLLImport的C#程序中使用DLL文件。 我有以下功能的DLL:使用DLLImport與char **和float **

int method(char* method, char** params, int n_params, float** res_arr, int* n_res); 

函數調用應該是這樣的:

method = "method1" 
char** = {"param1=1", "param2=2"} 
n_params = 2 
res_arr = the DLL function allocates an array and points this to it 
n_res = the DLL function sets to the number of results 

沒有爲釋放浮**一個單獨的功能。
我在C#中當前的代碼是這樣的:

private static extern int method(string method, ref IntPtr params, Int32 n_params, ref IntPtr res_arr, IntPtr n_res); 

我是新的C#(和我的C知識有點欠缺)對我的生活和無法弄清楚如何調用該函數(被面對我的鍵盤兩天)。有人能給我一個例子,說明如何完成這個任務以及如何調用這個函數?

我的主要問題是如何處理char**float**做,我不知道這是否是正確的指針類型的聲明,不知道我應該如何創建和發送我的char**的功能。

值得注意的是,我可能不會改變在DLL文件什麼。

編輯
這是功能,釋放出結果數組的描述:

free_results(float* res_arr)

EDIT2 我現在可以調用該方法,我也得到值回來,我現在的問題是我似乎訪問浮點值有問題。至於建議我使用Marshal.Copy()這樣的:

[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res); 

IntPtr res_arr = IntPtr.Zero; 
int n_res = 0; 
string[] s = new string[] { "param1" }; 

method("analyze", s, s.Length, out res_arr, ref n_res); 

float[] f_res = new float[n_res]; 
Marshal.Copy(res_arr, f_res, 0, n_res); 

的問題是,我只好像在浮動矢量獲得垃圾值。例如,在一種情況下,我應該得到100.0但得到任何15.03840.0,還告訴我,要麼我複製或還有別的東西腥當使用指針錯誤。在DLL中的代碼正常工作,因爲有另一個用C語言編寫的程序可以獲得正確的值。這感覺就像我做了一個指針的浮動,而不是它指向的東西。

+0

你不能捏住這個函數,res_arr參數是你的剋星。該DLL分配數組,您不能再釋放它。 C++/CLI包裝器和DLL的源代碼是必需的,因此您可以重新構建DLL並確保它使用與C++/CLI包裝器完全相同的CRT版本。一旦你有了源代碼,你實際上可以修復這個函數,所以它使用了一個你通過的緩衝區而不是自己分配一個緩衝區。 –

+0

@HansPassant爲什麼不呢?似乎有一個單獨的函數來釋放數組。 –

+0

的確,有一個free_results()函數可以調用釋放內存。 –

回答

1

這是解決我最初的問題(由Hans帕桑特的建議)代碼:

[DllImport("libs\\myDll.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int method(string method, string[] params, Int32 n_params, out IntPtr res_arr, ref int n_res); 

IntPtr res_arr = IntPtr.Zero; 
int n_res = 0; 
string[] s = new string[] { "param1" }; 

method("analyze", s, s.Length, out res_arr, ref n_res); 

float[] f_res = new float[n_res]; 
Marshal.Copy(res_arr, f_res, 0, n_res); 

我的第二個問題,其中float數組給垃圾的價值觀,是我的一個結果是一個完整的屁股帽子。在使用之前,必須調用DLL中的另一個函數,以便它具有要處理的值。在添加完這個調用之後,所有的工作都很完美