日期:2014-05-20  浏览次数:21119 次

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);
}


测下来结果是对的