none
【救助】c#调用vc dll时,函数参数为结构体指针,不知道该怎么转换?求指教!! RRS feed

  • 问题

  • 调用vc dll时,有这样一个函数

    DrfIsoMultiTagIdentify

    函数原型:DrfIsoMultiTagIdentify(HANDLE hCom, unsigned int * Count,TagIds *value, unsigned char ReaderAddr)

    功能说明:ISO18000-6B多标签ID识别

    输入参数: 

    hCom-串口句柄

    Count—识别到的标签数

    value—这是一个TagIds型结构体

    typedef struct

    {

    unsigned char TagType;

    unsigned char AntNum;

    unsigned char Ids[12];

    }TagIds;

    TagType—返回标签的类型

    AntNum—返回天线号

    Ids—返回读到的标签号,ISO18000-6B取前面8位

    ReaderAddr—读写器的地址,默认值为255,在485网络中应用,相当于tcp/ip的网络地址

    我在c#里面这样做的

    结构体申明

     IntPtr c_hcom=new IntPtr();
    
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct TagIds
        {
          [MarshalAs(UnmanagedType.U1)]
          Byte TagType;
          [MarshalAs(UnmanagedType.U1)]
          Byte AntNum;
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
          Byte[] ids;
        };
    
    函数的调用及功能测试代码:
        [DllImport("DrfApiV10.dll", EntryPoint = "DrfIsoMultiTagIdentify", CharSet = CharSet.Ansi)]
        //ISO18000-6B多标签ID识别
        public static extern int DrfIsoMultiTagIdentify(IntPtr hCom, ref UInt32 Count, TagIds[] value, Byte ReaderAddr);
    
        private void button4_Click(object sender, EventArgs e)
        {
                UInt32 Count=0;
          TagIds[] values=new TagIds[20];
          for (int i = 0; i <values.Length; i++)
          {
            values = new TagIds(); 
          }
          int temp = DrfIsoMultiTagIdentify(c_hcom, ref Count, values, 255);
          String tempstr =string.Empty;
          if (temp != 0)
          {
            MessageBox.Show(temp.ToString());
            
          }
          else
          {
    
            for (int i = 0; i < Count; i++)
            {
              for (int j = 0; j < 8; j++)
              {
    
                string s = String.Format("%02x", values.Ids);
                tempstr += s;
              }
    
            }
          }
        }
    
    这样编译运行后的结果temp不等于0,按照sdk里的说法,是函数调用不成功,请问各位大牛,这里应该怎么弄?不甚感激
    2010年9月13日 7:11

答案

  • 把函数的 C# 声明中的 TagId 换成 IntPtr,然后用 Marshal.StructureToPtr() 方法把 struct 实例转换成 IntPtr。


    Mark Zhou
    • 已标记为答案 BoberSong 2010年9月17日 7:25
    2010年9月13日 10:14

全部回复