PDA

View Full Version : LÀM SAO DÙNG DƯỢC KIỂU wchar_t trong C#



nguyentuanan1984
01-06-2009, 19:03
Các bạn có thể hướng dẫn giúp mình làm sao sử dụng kiểu (wchar_t*) trong C# với.
Chuyện là mình sử dụng import dll vào project,mà trong đó nó có cái hàm chứa tham số kiểu (wchar_t*) mình ko biết dùng kểiu gì để extern.Các bạn giúp với!!!!!!!

dq_ninh
02-06-2009, 14:29
Các bạn có thể hướng dẫn giúp mình làm sao sử dụng kiểu (wchar_t*) trong C# với.
Chuyện là mình sử dụng import dll vào project,mà trong đó nó có cái hàm chứa tham số kiểu (wchar_t*) mình ko biết dùng kểiu gì để extern.Các bạn giúp với!!!!!!!

Man... Cái này không biết có được không. Bởi vì wchar_t* là một pointer của C++ cho Unicode string. Mà C# không có pointer, chỉ có reference thôi.

Nhưng đổi wchar_t qua C# là char. Bạn hãy thử dùng char[] hay ref char[] coi có được không? Nếu được cho anh em biết với nha.

nguyentuanan1984
09-06-2009, 15:47
Cám ơn bạn đã gợi ý cho mình.Mình đã thử làm theo gợi y của bạn,kết quả mình được như sau:
1)[DllImport("Vnspeech.dll")]
public static extern int VietUniTTS(char[] s);
Mình gọi hàm như sau:
int i = VietUniTTS(textBox2.Text.ToCharArray());
Kết quả thông báo lỗi như sau:
Unable to find an entry point named 'VietUniTTS' in DLL 'Vnspeech.dll'.
2)[DllImport("Vnspeech.dll")]
public static extern int VietUniTTS(ref char[] s);
Mình gọi hàm tương tự và kết quả là debug không được
Báo 2 lỗi như sao:
1.The best overloaded method match for 'VietUniTTS(ref char[])' has some invalid arguments
2.Argument '1' must be passed with the 'ref' keyword
Mong các bạn hướng dẫn thêm!!!!!!

dq_ninh
10-06-2009, 00:27
Cám ơn bạn đã gợi ý cho mình.Mình đã thử làm theo gợi y của bạn,kết quả mình được như sau:
1)[DllImport("Vnspeech.dll")]
public static extern int VietUniTTS(char[] s);
Mình gọi hàm như sau:
int i = VietUniTTS(textBox2.Text.ToCharArray());
Kết quả thông báo lỗi như sau:
Unable to find an entry point named 'VietUniTTS' in DLL 'Vnspeech.dll'.
2)[DllImport("Vnspeech.dll")]
public static extern int VietUniTTS(ref char[] s);
Mình gọi hàm tương tự và kết quả là debug không được
Báo 2 lỗi như sao:
1.The best overloaded method match for 'VietUniTTS(ref char[])' has some invalid arguments
2.Argument '1' must be passed with the 'ref' keyword
Mong các bạn hướng dẫn thêm!!!!!!


Như vậy thì dùng #2 là đúng rồi. Nhưng khi gọi hàm VietUniTTS, bạn cần phải dùng keyword 'ref' như sau:

char[] parms = something;
int i = VietUniTTS(ref parms);

nguyentuanan1984
10-06-2009, 19:00
Như vậy thì dùng #2 là đúng rồi. Nhưng khi gọi hàm VietUniTTS, bạn cần phải dùng keyword 'ref' như sau:

char[] parms = something;
int i = VietUniTTS(ref parms);

Mình đã thử theo cách của bạn nhưng vẫn không được,bạn xem thử đoạn code mình upload lên xem thế nào nhé!!
Thân!!!!!!!!!
http://www.4shared.com/file/110960141/b5d28f00/SpeechVietNam.html

dq_ninh
11-06-2009, 09:20
Bạn ta ơi,

Có một chút xíu mà bạn bắt tôi phải tải về hơn 500KB rar file. Tôi không tải về đâu bạn ơi. Vì máy của tôi không có WinRar cũng như Winzip. Mà tôi cũng không muốn cài đặt bất cứ một phần mềm nào để unpack/pack rar fìle đâu. Bạn dùng Windows zip lại rồi email cho tôi có phải tiện hơn không.

Nhưng, căn cứ theo cái lỗi của #2 mà bạn đã đưa ra, thì bạn đã làm được rồi. Hai lỗi đó chỉ là một lỗi mà thôi. Lỗi ở chỗ bạn không gọi hàm đó đúng cách.

Thứ nhất, nếu thông biến từ là một ref char[], thì bạn không thể gọi hàm đó như bạn đã chỉ trong #1. VietUniTTS(textBox2.Text.ToCharArray());

Bởi vì gọi như vậy không được. Cái hàm ToCharArray() không đưa về cho bạn một ref của char array. Bạn phải tạo một biến từ như sau:

char[] text = new char(textBox2.Text.Length() + 1);
text = textBox2.Text.ToCharArray();
text[textBox2.Text.Length() ] = 0;
VietUniTTS(ref text);


Happy programming!

langxangvn
11-06-2009, 11:17
Bạn không nói rõ là cái method VietUniTTS nhận parameter in hay out direction. Nếu rõ ràng hơn thì sẽ dễ biết.

Nếu là input parameter bạn có thể dùng string làm parameter với chỉ định kiểu xác định là wide char luôn cũng được.
public static extern int VietUniTTS([In] [MarshalAs(UnmanagedType.LPWStr)] string s)

Nếu là output thì nên dùng StringBuilder tức khai báo dạng VietUniTTS([Out] StringBuilder s)

Bạn thử lại 2 cách này xem.