c# 结构体 指针 急!急!急!
我有一个DLL接口:
int __stdcall Get_Curr_Record(HANDLE icdev,int &Node_Addr,MJREC *Record_Data)
typedef struct _MJRec
{
long user_snr;// 用户流水号
char datetime[13];//YYMMDDHHMMSS 格式
UCHAR node; //打卡结点或读头号
}MJREC;
功能:读取结点当前记录,结点记录指针不变。
参数: icdev:(in)串口设备句柄
Node_Addr:(in)从机地址
Record_Data:(out)MJREC类型,返回一笔记录。
返回: 成功返回0
现在要在c#里面调用实现它。
我做了如下工作:
1、引用DLL:
[DllImport( "DASCOMM.DLL ",
EntryPoint= "Get_Curr_Record ",
CharSet=CharSet.Ansi,
CallingConvention=CallingConvention.StdCall)]
public static extern int Get_Curr_Record(int icdev,int Node_Addr,out IntPtr Record_Data);
2、声明结构体:
public struct MJREC
{
public int user_serial;
public byte[] sktime;
public byte node_addr;
}
3、调用:
IntPtr Record_Data=IntPtr.Zero;
KL_card.Hand_Shake(icdev,Node_Addr,password);
int i=KL_card.Get_Curr_Record(icdev,Node_Addr,out Record_Data);
if(i==0)
MessageBox.Show( "获取数据成功 ");
else
MessageBox.Show(doitmyself.error(i));
MJREC testsize=new MJREC();
testsize=(MJREC)Marshal.PtrToStructure(Record_Data,testsize.GetType());
问题:运行时报错,未将对象引入实例。高手请指点,我哪地方出错啦及如何修改??
------解决方案--------------------Record_Data为MJREC类型
用MJREC Record_Data=new MJREC();初始化。结构体如下声明试试:
StructLayout(LayoutKind.Sequential)]
public struct MJREC
{
public int user_serial;
public string sktime;
public char node_addr;
}
另外串口设备句柄是否正确?
------解决方案--------------------[DllImport( "DASCOMM.DLL ",EntryPoint= "Get_Curr_Record ",CharSet=CharSet.Ansi,
CallingConvention=CallingConvention.StdCall)]
public static extern int Get_Curr_Record(IntPtr icdev,ref int Node_Addr,out MJREC Record_Data);
public struct MJREC
{
public int user_serial;
public byte[] sktime;
public byte node_addr;
}
//call
MJREC testsize=new MJREC();
testsize.sktime = new byte[13];
Get_Curr_Record( icdev,ref Node_Addr,out testsize);
------解决方案--------------------c++代码
extern "C " int _declspec(dllexport) Get_Curr_Record(HANDLE icdev,int &Node_Addr,MJREC *Record_Data)
{
Node_Addr = 1;
Record_Data-> node = '2 ';
Record_Data-> datetime[0] = '2 ';
Record_Data-> user_snr = 2;
return 0;
}
c++测试用dll
[DllImport( "TestStruct.dll ")]
public static extern int Get_Curr_Record(System.IntPtr handle,ref int aa,ref MJREC a);
而写结构不需要new 数组的
new 了也不会错
{
int i = 0;
MJREC a = new MJREC();
Get_Curr_Record(this.Handle, ref i,ref a);
}
测下来结果是对的