110,566
社区成员
发帖
与我相关
我的任务
分享
int __stdcall misposTrans(void* input, void* output)
typedef struct
{
char TransType[2]; //交易代码
char CardNo[19]; //卡号
char Amount[12]; //交易金额
char Tip[12]; //小费金额(暂时不用,空格补齐)
}} ST_ICBC_MIS;
[DllImport("KeeperClient.dll", EntryPoint = "misposTrans", CallingConvention = CallingConvention.StdCall)]
public static extern int misposTrans(ref ST_ICBC_MIS input, out ST_ICBC_MIS output);
public struct ST_ICBC_MIS
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] //这里的2就是数组长度
public Byte[] TransType; //交易代码
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)]
public Byte[] CardNo; //卡号
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public Byte[] Amount; //交易金额
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public Byte[] Tip; //小费金额(暂时不用,空格补齐)
}
ST_ICBC_MIS strInput = new ST_ICBC_MIS();//初始化结构
ST_ICBC_MIS strOutput= new ST_ICBC_MIS();//初始化结构
strInput.TransType = new Byte[2];
strInput.CardNo = new Byte[19] ;
strInput.Amount = new Byte[12] ;
strInput.Tip = new Byte[12] ;
Byte[] buf = new Byte[2]{0, 9};//赋值
strInput.TransType = buf;
int i = IcbcMis.misposTrans(ref strInput, out strOutput);
[StructLayout(LayoutKind.Sequential)]
public struct ST_ICBC_MIS
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] //这里的2就是数组长度
public Byte[] TransType; //交易代码
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)]
public Byte[] CardNo; //卡号
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public Byte[] Amount; //交易金额
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public Byte[] Tip; //小费金额(暂时不用,空格补齐)
}
不知道是否有作用
而且strOutPut是否有初始化?[DllImport("KeeperClient.dll", EntryPoint = "misposTrans", CallingConvention = CallingConvention.StdCall)]
public static extern int misposTrans(IntPtr input, IntPtr output);
使用Marshal.StructureToPtr将结构体转换成IntPtr传入
//输入指针
IntPtr ptrInput = new IntPtr();
Marshal.StructureToPtr(strInput, ptrInput, false);
//分配输出指针
IntPtr ptrOutput = Marshal.AllocHGlobal(Marshal.SizeOf(strOutput));
//填充输出内存
int i = IcbcMis.misposTrans(ptrInput, ptrOutput);
//输出指针转化为结构
strOutput = (ST_ICBC_MIS)Marshal.PtrToStructure(ptrOutput, typeof(ST_ICBC_MIS));
//释放分配的空间
Marshal.FreeCoTaskMem(ptrOutput);
payShuaka();//初始化传入结构
strOut();//初始化传出结构
Byte[] buf = new Byte[2] { 1, 4 };
strInput.TransType = buf;//传入结构的一个 变量赋值。
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(strInput));
IntPtr ptr1 = Marshal.AllocHGlobal(Marshal.SizeOf(strOutput));
strOutput = (ST_ICBC_MIS)Marshal.PtrToStructure(ptr, typeof(ST_ICBC_MIS));
Marshal.StructureToPtr(strInput, ptr, true);//将结构体转换成IntPtr
Marshal.StructureToPtr(strOutput, ptr1, true);//将结构体转换成IntPtr
int i = IcbcMis.misposTrans(ptr, ptr);//执行
Marshal.FreeCoTaskMem(ptr);//释放
Marshal.FreeCoTaskMem(ptr1);
public struct ST_ICBC_MIS
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] //这里的2就是数组长度
private Byte[] m_TransType; //交易代码
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)]
private Byte[] m_CardNo; //卡号
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
private Byte[] m_Amount; //交易金额
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
private Byte[] m_Tip; //小费金额(暂时不用,空格补齐)
public ushort TransType
{
get
{
if (m_TransType == null)
m_TransType = new byte[2];
return BitConverter.ToUInt16(m_TransType, 0);
}
set
{
if (m_TransType == null)
m_TransType = new byte[2];
Array.Copy(BitConverter.GetBytes(value), m_TransType, 2);
}
}
public string CardNo
{
get
{
if (m_CardNo == null)
m_CardNo = new byte[19];
int pos = 0;
while (pos < 19 && m_CardNo[pos + 1] != 0) pos++;
return Encoding.ASCII.GetString(m_CardNo, 0, pos);
}
set
{
if (m_CardNo == null)
m_CardNo = new byte[19];
byte[] b = Encoding.ASCII.GetBytes(value);
Array.Copy(b, m_CardNo, b.Length < 19 ? b.Length : 19);
}
}
public double Amount
{
get
{
if (m_Amount == null)
m_Amount = new byte[12];
return double.Parse(Encoding.ASCII.GetString(m_Amount));
}
set
{
if (m_Amount == null)
m_Amount = new byte[12];
Array.Copy(Encoding.ASCII.GetBytes(value.ToString("0.00").PadRight(12)), m_Amount, 12);
}
}
}
typedef struct
{
char TransType[2]; //交易代码
char CardNo[19]; //卡号
char Amount[12]; //交易金额
char Tip[12]; //小费金额(暂时不用,空格补齐)
}} ST_ICBC_MIS;
这里多一个反括号 不过你的问题应该不在这里……
int i = IcbcMis.misposTrans(ref strInput, out strOutput);
这个 IcbcMis从哪来的?