本帖最后由 zhenghaolan 于 2014-07-11 12:02:52 编辑

解决方案 »

  1.   

    typedef struct TagData_struct{
        double value; //返回点的数值
        long     time; //返回点的时间,秒
        int  status; //返回点的状态数据类型没对应吧,C#里面是int C++里面是long的话
      

  2.   


    并没有吧,int、long都是4个byte啊
      

  3.   

    C#里面的long是C++中的LONGLONG,所以C#结构体中time应该是int型的
      

  4.   


    并没有吧,int、long都是4个byte啊
    好像不是吧?
      

  5.   


    这样啊,谢谢你和1L可是改完了我得到的数据还是不对的
    如果把函数声明成
     public extern static int GetRTDataByBatch([In] string[] tagName, ref TagData[] tgs, long nCount);
    后面用结构体数组直接传参可以得到第一个值是正确的,可是后面又不对了
      

  6.   


    这样啊,谢谢你和1L可是改完了我得到的数据还是不对的
    如果把函数声明成
     public extern static int GetRTDataByBatch([In] string[] tagName, ref TagData[] tgs, long nCount);
    后面用结构体数组直接传参可以得到第一个值是正确的,可是后面又不对了C++的TagData_struct声明要加#pragma pack(1)
      

  7.   

    谢谢楼上各位,不是对齐的问题
    查了大半天MSDN
    参考这里
    http://msdn.microsoft.com/zh-cn/library/hk9wyw21.aspx[DllImport("DataInterface.dll", CharSet = CharSet.Ansi, EntryPoint = "GetRTDataByBatch", CallingConvention = CallingConvention.Cdecl)]
    public extern static int GetRTDataByBatch([In] string[] tagName, [In,Out] TagData[] tgs, long nCount);注意第二个参数的[In,Out]属性,单独的in或者out都不行
    调用时初始化结构体数组
     TagData[] tags = new TagData[2];
                for (int i = 0; i < tags.Length; i++)
                {
                    tags[i] = new TagData();
                }iRet = LibWrapper.GetRTDataByBatch(tagNames, tags, 2);
    这样就可以了
      

  8.   


    能给段代码吗,还在入门。。
    RtlMoveMemory 会用吗