当前位置: 代码迷 >> C# >> c# 调用c++dll库,多谢
  详细解决方案

c# 调用c++dll库,多谢

热度:475   发布时间:2016-04-28 08:34:53.0
c# 调用c++dll库,谢谢!
一个DLL文件,如何使用里面的函数,请用C#详细解释调用过程及返回结果,谢谢!!!!
2.      总体说明

接口采用DLL动态加载方式,提供一个DLL名为KeeperClient.dll供应用程序调用,里面提供一个函数:

int __stdcall misposTrans(void* input, void* output)。

银行卡的所有交易功能均通过此函数交互,根据不同的参数实现不同的功能。

3.      接口函数原型说明

int __stdcall misposTrans(void* input, void* output)

其中输入输出结构的内容为:如果字段实际长度小于要求的长度,请后补空格,如果该交易没用该字段,请用空格补齐,其中交易金额为12为定长,以分为单位,不足12位左补零。结构定义如下:

typedef struct

{

   char TransType[2];    //交易代码

   char CardNo[19];             //卡号

     char Amount[12];              //交易金额

     char Tip[12];               //小费金额(暂时不用,空格补齐)

     char MisBatchNo[6];        //MIS批次号(暂时不用,空格补齐)

     char MisTraceNo[6];         //MIS流水号(暂时不用,空格补齐)

     char TransTime[6];            //交易时间

     char TransDate[8];            //交易日期

   char ExpDate[4];              //卡片有效期

     char Track2[37];         //二磁道信息(暂时不用,空格补齐)

     char Track3[104];       //三磁道信息(暂时不用,空格补齐)

     char ReferNo[8];        //系统检索号,撤销时需要传入原交易检索号

     char AuthNo[6];                //授权码 (暂时不用,空格补齐)

     char ReturnCode[2];         //返回码(MISPOS系统返回,返回码为“00”表示交易成功,否则表示交易失败)

     char TerminalId[15];         //终端号

     char MerchantId[12];        //商户号

     char InstallmentTimes[2]; //MISPOS系统返回 (暂时不用,空格补齐)

     char TC[16];               //MISPOS系统返回 (暂时不用,空格补齐)

     char OldAuthDate[8];              //原交易日期,撤销交易时传入

     char MerchantNameEng[50];   //商户名称(英文)

     char MerchantNameChs[40];   //商户中文名称

     char TerminalTraceNo[6]; //终端流水号

     char TerminalBatchNo[6];       //终端批次号

     char IcCardId[4];              //MISPOS系统返回(暂时无需处理)

     char ForeignCardTraceNo[24];       //MISPOS系统返回(暂时无需处理)

     char Remark[300];            //MISPOS系统返回(暂时无需处理)

     char CardType[20];           //MISPOS系统返回(暂时无需处理)

     char TransName[20];         //交易中文名称

     char TransTotal[800];        //交易总账(暂时无需处理)

     char DeviceInitFlag[1];            //MISPOS系统返回(暂时无需处理)

     char Message[100];           //交易失败时,返回中文错误描述信息

     char IssuId[4];                   //发卡行代码

     char IssuName[20];      //发卡行名称

char Platid[10];         //收银台号

char Operid[10];        //操作员号

} ST_ICBC_MIS;

4.      交易说明

 

1)        消费:

输入:交易代码(05) 交易金额

输出:卡号 金额 MIS流水号 交易时间 交易日期 有效期 检索参考号 返回码 终端号 商户编号 英文商户名称 商户名称 终端流水号 终端批次号 交易名称 交易结果描述信息

2)        撤销/退货:

输入:交易代码(04) 交易金额 检索参考号 原交易日期 终端号(退货需要)

输出:卡号 金额 MIS流水号 交易时间 交易日期 有效期 检索参考号 返回码 终端号 商户编号 英文商户名称 商户名称 终端流水号 终端批次号 交易名称 交易结果描述信息

3)        余额查询:

输入:交易代码(10)

输出:返回码 交易结果描述信息

4)        重打印:

输入:交易代码(13)检索参考号(重打任一笔传入,重打上笔不传)

输出:卡号 金额 MIS流水号 交易时间 交易日期 检索参考号 返回码 终端号 商户编号 英文商户名称 商户名称 终端流水号 终端批次号 交易名称 交易结果描述信息

5)        分期付款:

输入:交易代码(TransType)(12) 交易金额  分期期数( InstallmentTimes)

输出:卡号 金额 MIS流水号 交易时间 交易日期 有效期 检索参考号 返回码 终端号 商户编号 英文商户名称 商户名称 终端流水号 终端批次号 交易名称 交易结果描述信息 期数

6)        其他交易(查询明细等功能在此交易里,后面是手工选择):

输入:交易代码(52)

输出:返回码 交易结果描述信息

7)        打印总账交易

输入:交易代码(14)

输出:返回码 交易结果描述信息

8)        快速消费(非接):

输入:交易代码(21) 交易金额

输出:卡号 金额 MIS流水号 交易时间 交易日期 有效期 检索参考号 返回码 终端号 商户编号 英文商户名称 商户名称 终端流水号 终端批次号 交易名称 交易结果描述信息

   9)签到交易

输入:交易代码(09)

输出:返回码 交易结果描述信息
------解决思路----------------------


你只要定义好结构直接Copy上面的那个结构。你不会C#的结构也不懂吧?
然后void* 转成C#就是IntPtr

------解决思路----------------------
如楼上所说,只需要转调用的参数。具体给你一个实例
  public class DevicePackage
    {
        [DllImport("RFIDRD303.dll")]
        public static extern int RD_OpenCom(string pPort, int nBaudRate, int nCFlow);

        [DllImport("RFIDRD303.dll")]
        public static extern int RD_CloseCom(int hComm);

        [DllImport("RFIDRD303.dll",
            CallingConvention = CallingConvention.StdCall,
            CharSet = CharSet.Ansi)]
        public static extern int RD_DetectTagHfIR(int hComm, StringBuilder  pUidInfo, ref int nUidCount);

        [DllImport("RFIDRD303.dll")]
        public static extern int RD_SetRealTimeBeep(int hComm, int nIndex, int nVoice, int nLed, int nColor);
    }
------解决思路----------------------
好多啊
定义一个和C++结构ST_ICBC_MIS一样的C#结构,new一个输入对象,一个输出对象,取他们的地址,传进去
------解决思路----------------------
声明
[DllImport("xxxxxxxxxxx.dll", CallingConvention = CallingConvention.StdCall)]
static extern int misposTrans(ref ST_ICBC_MIS input, out ST_ICBC_MIS output)


结构体,因为内部结构都一样的,就写一个
[StructLayout(LayoutKind.Sequential)]
struct ST_ICBC_MIS
{
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] //这里的2就是数组长度
      byte[] TransType;    //交易代码
      //..........
}


以上可能有拼写错误,自己更正
  相关解决方案