一个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; //交易代码
//..........
}
以上可能有拼写错误,自己更正