当前位置:编程学习 > C#/ASP.NET >>

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);
--------------------编程问答--------------------
引用 1 楼 zwh8800 的回复:
C# code

[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
public static extern int IC_Read_SerialNO(
                                     [MarshalAs(UnmanagedType.LPStr)]  //用MarshalAs封装一下……


大哥不行啊!出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。” --------------------编程问答-------------------- 没用过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)
--------------------编程问答--------------------
引用 5 楼 windhuan 的回复:
C# code

[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;
        }
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 8 楼 mjp1234airen4385 的回复:
使用StringBuilder是可以的,至于乱码可能是用字符编码不一致引起的。
你试试把C#接收到的数据转换成gb2312编码试试。
以前的一个demo函数


国标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);



--------------------编程问答--------------------
引用 8 楼 mjp1234airen4385 的回复:
使用StringBuilder是可以的,至于乱码可能是用字符编码不一致引起的。
你试试把C#接收到的数据转换成gb2312编码试试。
以前的一个demo函数

C# code

string GetStringA(string Value)
        {
            byte[] bData = Encoding.GetEncoding("gb2312") .Ge……



大哥也不行啊!都是乱码啊! --------------------编程问答--------------------
引用 10 楼 zwh8800 的回复:
引用 8 楼 mjp1234airen4385 的回复:

使用StringBuilder是可以的,至于乱码可能是用字符编码不一致引起的。
你试试把C#接收到的数据转换成gb2312编码试试。
以前的一个demo函数


国标2312对ASCII低位英文是兼容的 从lz所列的函数名上看IC_Read_SerialNO应该是数字或英文之类的字符串 如果ASCII解码无异常 GB2312……


大哥也不行啊! --------------------编程问答--------------------

[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO, CharSet = CharSet.Ansi]
public static extern int IC_Read_SerialNO(IntPtr aSerialNO);
--------------------编程问答-------------------- 你把得到的数据以二进制的格式写到一个文件中,把这个文件发到网上,
让大家帮你分析分析文件中使用的是哪种格式。
另外,你自己可以使用UE中的格式转换实施看看是什么格式的数据,
然后你采用相应的编码格式解码。 --------------------编程问答-------------------- 实在不行的话,只能认为你取出的数据不正常了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,