怎样处理DLL中char*类型参数的内容?
1.DLL原形:
int __stdcall _ReadCard(char *S); //读卡
2.
在DELPHI调用返回:
{182,193,191,168,202,167,176,220,161,163, 'E ', 'r ', 'r ', 'o ', 'r ', ': ', '- ', '2 ', '2 ',0}
显示:读卡失败。Error:-22
3.
在vs2005+C#调用:
[DllImport( "LsdSle4442.dll ", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 _ReadCard(byte[] S);
private void btnRead_Click(object sender, EventArgs e)
{
byte[] buf;
buf = new Byte[255];
int n = _ReadCard(buf);
string s = Encoding.ASCII.GetString(buf);
MessageBox.Show(s);
}
中buf返回:
{182,193,191,168,202,167,176,220,161,163,69,114,114,111,114,58,45,50,50,0,...}
显示:??????????Error:-22
问:既然得到了正确的数据,我怎样才能让它显示为:读卡失败。Error:-22
------解决方案--------------------using System.Text;
using System.Windows.Forms;
class Program
{
static void Main()
{
byte[] buf = {182,193,191,168,202,167,176,220,161,163,69,114,114,111,114,58,45,50,50,0,};
string s = Encoding.GetEncoding( "GB2312 ").GetString(buf);
MessageBox.Show(s);
}
}
// 显示:读卡失败。Error:-22
------解决方案--------------------string s = Encoding.GetEncoding( "GB2312 ").GetString(buf);
这一句换成
string s = Encoding.Default.GetString(buf);
用系统默认的字符集来解码,不要固定为GB2312,这样以后如果要移植在非中文的系统上减少麻烦。