2011-09-02 77 views
2

我寫了一個C++ DLL用下面的函數出口帶char *參數的DLLImport。只有一個字符傳遞

extern "C" BOOL WINAPI SetUserPassword(const char* u, const char* p) 

當從C#調用這個我使用下面的代碼

[DllImport("mydll.dll")] 
private static extern int SetUserPassword(String user, String password); 

現在,當SetUserPassword只叫我得到每個參數的第一個字母。我做了一些谷歌搜索,發現String可能不是最好的使用IntPtr和Marshal.StringToBSTR()嘗試,但這也不起作用。

這應該如何正確構造?如果需要,我可以修改C ​​++ DLL。

回答

9

是唯一有意義的事情是,你的C#代碼居然是:

[DllImport("mydll.dll", CharSet = Unicode)] 
private static extern int SetUserPassword(String user, String password); 

當你這樣做,你通過一個寬字符基於字符串到你的C++代碼,因爲它預計單字節字符它解釋第一個兩字節字符後半部分的0字節作爲字符串終止符。

你應該寫:

[DllImport("mydll.dll", CharSet = Ansi)] 
private static extern int SetUserPassword(String user, String password); 

或者其實你可以把它正好在你的問題寫成因爲Ansi是默認的。


而事實上,事實證明,你是在CE不支持Ansi字符集,所以唯一合理的解決辦法就是讓你的C++代碼接受寬字符字符串。

+2

啊!我忘了在WinCE上提及IM。我所做的只是將我的C++函數改爲接受'wchar_t',然後將其轉換爲ANSI'std :: string',現在它全部正常工作 - 謝謝! – Chris

+0

同意。或[MarshalAs]。具有「mydll.dll」的代碼段未被複制/粘貼。 Tsk,tsk,+1進行心理調試。 –

相關問題