c#调联迪MisPos.dll的问题

之前没用过C#,目前也是边学边开发,网上关于联迪读卡器、Pos的资料少之又少,研究了好几天还是没有调通,希望有调过联迪dll的大神指点一下!

1、dll函数说明:
int __stdcall BankTrans(char * InputData, char* OutPutData)

输入参数InputData:
typedef struct
{
    char trans[2];    /*交易类型:(  '10'-获取卡号  '00'-签到 '01'-消费 '02'-消费撤销  '03'- 隔日退货  '04'-查询  '05-重打印  '06-结算 '07'-批量退货 )*/
  char CardType[2];  /*卡类型*/
    char amount[12];        /* 金额(12字节,无小数点,左补0,单位:分)*/
    char card_no[20];     /*卡号  (20字节,左对齐,不足部分补空格)*/
    char old_reference[12];   /*原交易参考号*/
    char old_trace[6];   /*原交易流水号*/
    char UserNO[15];    /*原交易商户号*/
    char TerNO[15]; /*原交易终端号*/
    char Date[8];       /*原交易日期yyyymmdd*/
    char VerifyInfo[300]; // 认证数据
} InputData;


输出 OutPutData,结构体如下
typedef struct   
{
    char resp_code[2];/*0~1位    返回码   ( 2字节, "00"成功)*/
    char card_no[20];/*卡号   (20字节,左对齐,不足部分补空格)*/
    char amount[12];/*  金额(12字节,无小数点,左补0,单位:分)*/
        char reference[12]; /*交易参考号*/
    char trace[6];   /*流水号  (6字节,左对齐)*/
    char UserNO[15];    /*商户号*/
    char TerNO[15]; /*终端号*/
        char CardType[2];  /*卡类型*/
    char expr[4];/*有效期    (4字节) */
    char BatchNo[10];/*批次号*/
    char Date[8];       /*交易日期yyyymmdd*/
    char Time[6];       /*交易时间hhmmss*/ 
    char CardName[20];  /*发卡行中文名*/
    char old_amount[12];/*  原交易金额(12字节,无小数点,左补0,单位:分)*/
        char old_reference[12];   /*原交易参考号 */
    char old_trace[6];   /*原交易流水号*/
        char old_UserNO[15];    /*原交易商户号*/
    char old_TerNO[15]; /*原交易终端号*/
    char old_Date[8];       /*原交易日期yyyymmdd*/
    char resp_chin[100];/*86~185位  错误说明(40字节,左对齐,不足部分补空格)*/
} OutPutData;

图片说明

2、我在c#里引用dll方法里是这么定义的

[DllImport("MisPos.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int BankTrans(INPUT_MIS request, StringBuilder response);


 [StructLayout(LayoutKind.Sequential)]
    public struct INPUT_MIS
    {
        /*交易类型:('10'-获取卡号  '00'-签到 '01'-消费 '02'-消费撤销  '03'- 隔日退货  '04'-查询  '05-重打印  '06-结算 '07'-批量退货 )*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
        public string trans;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct OUTPUT_MIS
    {
        /*0~1位  返回码   ( 2字节, "00"成功)*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)] //这里的2就是数组长度
        public string resp_code;
        /*卡号    (20字节,左对齐,不足部分补空格)*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
        public string card_no;
        /*卡类型*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
        public string CardType;
        /*错误说明*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public string resp_chin;
    }

输入输出类型定义为 结构体、StringBuilder还是 IntPtr ?? 我都试了一遍

3、具体调用:

     INPUT_MIS input = new INPUT_MIS();
                       StringBuilder output = new StringBuilder(2000);
                       input.trans = "10";
                       //调用
                       int result = LDE820D.LDE820D.BankTrans(input, output);
                       MessageBox.Show("result:" + result + "----" + output);

4、返回结果为:
图片说明

5、联迪设备是串口设备,测试demo需要根据自己电脑设备管理器修改串口号,这种设备是可以直接调dll还是通过打开串口那种模式开发。
像神思的设备直接调dll就可以驱动读卡器读卡,扫码墩切成串口模式就需要通过打开串口来接收数据,联迪的这种应该怎么弄呢????

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问