C#调用delphi写的DLL出现乱码 [DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]public static extern int IC_Read_SerialNO( [MarshalAs(UnmanagedType.LPStr)] //用MarshalAs封装一下 string aSerialNO); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没用过Delphi 不知道function IC_Read_SerialNO(var aSerialNO: Pchar): Integer;中 Pchar是什么类型 还有 那个var干什么的 [DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]public static extern int IC_Read_SerialNO(StringBuilder aSerialNO) 用string一定不行(我先前没注意需要对字符串进行操作,string的内存不能修改)但也不能直接用stringbuilder,需要用marshalas封装,关键是知道那个PCHAR在内存中是怎么存储的 使用StringBuilder是可以的,至于乱码可能是用字符编码不一致引起的。你试试把C#接收到的数据转换成gb2312编码试试。以前的一个demo函数string GetStringA(string Value) { byte[] bData = Encoding.GetEncoding("gb2312") .GetBytes(Value); byte[] bDataresult = new byte[bData.Length]; int i = 0; for (i = 0; i < bData.Length; i++) { if (bData[i] == 0) break; bDataresult[i] = bData[i]; //Result += Convert. .ToChar(bData[i]); } string Result = Encoding.GetEncoding("gb2312").GetString(bDataresult, 0, i); return Result; } 国标2312对ASCII低位英文是兼容的 从lz所列的函数名上看IC_Read_SerialNO应该是数字或英文之类的字符串 如果ASCII解码无异常 GB2312也应该不会有什么异常应该还是数据封装方面的问题 [DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]public static extern int IC_Read_SerialNO( [MarshalAs(UnmanagedType.LPWStr)] //LZ再试试用LPWStr(Unicode编码)试试看 string aSerialNO); [DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO, CharSet = CharSet.Ansi]public static extern int IC_Read_SerialNO(IntPtr aSerialNO); 导入excel问题 读取数据库字段进数组 废弃的代码要保留在项目中吗? WINDOWS窗口任务栏控制 c# 怎么为一个控件添加两个事件? WinForm应用程序为什么这麽耗内存? 版主,为什么我的收藏夹里的资料没有了呀? 两个form窗体上dategridview 拖拽 关于 Quartz.Net 问题,求助 double型数据的显示问题,在线等待给分 C# 求一个数学正则表答式.非常感谢!
function IC_Read_SerialNO(var aSerialNO: Pchar): Integer;
中 Pchar是什么类型 还有 那个var干什么的
[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
public static extern int IC_Read_SerialNO(StringBuilder aSerialNO)
你试试把C#接收到的数据转换成gb2312编码试试。
以前的一个demo函数string GetStringA(string Value)
{
byte[] bData = Encoding.GetEncoding("gb2312") .GetBytes(Value);
byte[] bDataresult = new byte[bData.Length];
int i = 0;
for (i = 0; i < bData.Length; i++)
{
if (bData[i] == 0) break;
bDataresult[i] = bData[i];
//Result += Convert. .ToChar(bData[i]);
}
string Result = Encoding.GetEncoding("gb2312").GetString(bDataresult, 0, i);
return Result;
}
国标2312对ASCII低位英文是兼容的 从lz所列的函数名上看IC_Read_SerialNO应该是数字或英文之类的字符串 如果ASCII解码无异常 GB2312也应该不会有什么异常
应该还是数据封装方面的问题
[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
public static extern int IC_Read_SerialNO(
[MarshalAs(UnmanagedType.LPWStr)] //LZ再试试用LPWStr(Unicode编码)试试看
string aSerialNO);
[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO, CharSet = CharSet.Ansi]
public static extern int IC_Read_SerialNO(IntPtr aSerialNO);