2013-04-14 37 views
0

[C/C++代碼]字符串數組時,從C/C++

extern "C" __declspec(dllexport) int Analyze_input_text(char* input_text, char *ppArray){ 
    int size; 
    // code... 
    return size; 
} 

[C#代碼]

[DllImport("PP_TextAnalyzer.dll",CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)] 
extern public static int Analyze_input_text(IntPtr data, [MarshalAs(UnmanagedType.LPArray, SizeConst = 100)] string[] ppArray); 

public int GetResultData(string input_text) 
{ 
    IntPtr pStr = Marshal.StringToCoTaskMemUni(input_text); 
    List<string> ppArray = new List<string>(); 
    int size = **Analyze_input_text(pStr,ppArray.ToArray());** //Array(List) is still null. 
    return size; 
} 

C#dllimport的,我不知道怎麼了解決這個問題?

任何幫助?

+1

ppArray參數的合約是什麼?誰負責分配?解放它?如果它是char *,它不是* char *的數組。 –

回答

1

字符集= CharSet.Unicode

嗯,這是不是。該函數採用char *,一種8位字符類型。 ppArray可能是一個字符串數組,這也是相當不清楚的,這將是char **。至於宣佈,適當的PInvoke的聲明是:

[DllImport("PP_TextAnalyzer.dll", CallingConvention = CallingConvention.Cdecl, 
       CharSet=CharSet.Ansi)] 
extern public static int Analyze_input_text(string data, string ppArray); 

如果你真的打算傳遞一個字符串數組,那麼你將不得不修改C函數至少:

extern "C" __declspec(dllexport) 
int Analyze_input_text(char* input_text, char** ppArray, int arraySize) 

並聲明ppArray參數作爲字符串[]在您的C#代碼。請注意,您確實應該在您的C代碼中使用Unicode,即wchar_t *。試圖「分析」從Unicode複製到本地8位系統代碼頁的文本從一開始就是一個有損命題。當然,要確保這些代碼在C#中編寫代碼時速度不會很快,並且損失較小。 .NET對Unicode有很好的支持。

+0

感謝您的回答。其實我用.NET來對待韓國人的角色(我認爲它是unicode ..)。 – user1645680

+0

但我仍然有問題,我改變了.. – user1645680