C#调用delphi写的DLL出现乱码
因项目需求调用JX801读写器接口,但开发商只提供了delphi接口,我现在需要在c#中调用这个接口function IC_Read_SerialNO(var aSerialNO: Pchar): Integer;
参数说明:
aSerialNO: 用于存放返回的序列号
C#代码如下:
[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
public static extern int IC_Read_SerialNO(ref System.String aSerialNO);
调用
String str = String.Empty;
IC_Read_SerialNO(ref str);
但调用后,返回值为乱码
请大家帮忙看看错误在哪里?谢谢! --------------------编程问答--------------------
--------------------编程问答--------------------
[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
public static extern int IC_Read_SerialNO(
[MarshalAs(UnmanagedType.LPStr)] //用MarshalAs封装一下
string aSerialNO);
大哥不行啊!出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。” --------------------编程问答-------------------- 没用过Delphi 不知道
function IC_Read_SerialNO(var aSerialNO: Pchar): Integer;
中 Pchar是什么类型 还有 那个var干什么的 --------------------编程问答-------------------- 是和C里面的char*一样的吗? --------------------编程问答--------------------
--------------------编程问答--------------------
[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);
让大家帮你分析分析文件中使用的是哪种格式。
另外,你自己可以使用UE中的格式转换实施看看是什么格式的数据,
然后你采用相应的编码格式解码。 --------------------编程问答-------------------- 实在不行的话,只能认为你取出的数据不正常了。
补充:.NET技术 , C#