wince writefile 总是发送不了数据,但不报错!

xwell   2009-3-31 09:41 楼主
问题如下:
       我现在接手别人的工作,驱动别人是用evc4.2写dll,驱动经测试可用。
       我现在用C#开发应用程序。
       现在的问题是,驱动writefile第二个参数他传的是一个结构体引用。里面有设备的基地址。
      evc的结构体如下:
      struct SetInfo
      {
           ULONG address;
           BYTE data[4];
        }
     在evc里的调用
     writefile(handle,&setinfo,sizeof(setinfo),&nWriten,NULL)
     没有问题,

    现在我的问题是,我要写数据,我在C#里定义的结构体如下:
         [StructLayout(LayoutKind.Sequential)]
        unsafe public struct SetInfo
        {
            public ulong address;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] data;
        }
    在C#里申明的writefile如下:
         [DllImport("coredll.dll")]        
        unsafe public static extern bool WriteFile(
        System.IntPtr h_comm,                                         //   file handle   
        ref SetInfo text,
        UInt32 length,
        ref UInt32 length2,
        UInt32 overlap
        );

    测试代码如下:
      unsafe
            {
                UInt32 HasWriten = 1;
                common.IOFile.SetInfo Setinfo = new IOtest.common.IOFile.SetInfo();
                Setinfo.address = 0x200;
                Setinfo.data = new Byte[4];
                Setinfo.data[0] = 0x3;
                Setinfo.data[1] = 0x4;
                Setinfo.data[2] = 0x5;
                Setinfo.data[3] = 0x6;
                if (common.IOFile.WriteFile(HandlePtr, ref Setinfo, (UInt32)Marshal.SizeOf(Setinfo), ref HasWriten, 0))
                {
                    this.lbState.Text = HasWriten + " bytes data have writen to the IOBoard !  structSize: " + Marshal.SizeOf(Setinfo);
                }
                else
                {
                    this.lbState.Text = "Some Error ocurred ,can not write to the IOBoard !  LastErrorCode:" + common.IOFile.GetLastError();
                }
            }

     结果是编译,运行都没有问题,显示:0 bytes data have writen to the IOBoard !  structSize:8
     总也发不了数据!
      我估计是结构体的问题,但开始也用了Marshal.StructureToPtr,都没有成功,也是不报错,但发不了数据!
      
      高手们帮忙啊!
      紧急!
      

回复评论 (8)

补充:
   刚才说的那个C#定义的结构体长度是:16
   后来考虑到ULONG在evc与VS2005里的字节可能不一样,如是改成:
         [StructLayout(LayoutKind.Sequential)]
        unsafe public struct SetInfo
        {
            public UInt32 address;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] data;
        }
   这个长度才是:8
   但问题依旧,发送依然是0字节!
   求助!
点赞  2009-3-31 09:44
debug看看
点赞  2009-3-31 10:41
to: xqhrs232
     关键是没办法debug啊,驱动不是我写的,那人已走!
      代码都没得!
点赞  2009-3-31 11:08
高手来看看啊,快疯了
点赞  2009-3-31 11:48
引用: 引用 3 楼 yolon3000 的回复:
to: xqhrs232
    关键是没办法debug啊,驱动不是我写的,那人已走!
      代码都没得!


比重写还麻烦。不知道里面是什么,没有经过验证,测试的DLL,现在拿来用,还是不要为好。
点赞  2009-3-31 11:54
源代码都没有,只能自己重写
就算发现了问题,LZ你也修改不了啊
点赞  2009-3-31 13:04
1. 不知你的 "驱动经测试可用" 是如何測試的??

2. C# 不會用, 不知你的 Setinfo.data = new Byte[4]; 與 C 中的 BYTE data[4]; 是否完全一樣, 建議你先用 evc 寫 native code 來做測試, 這樣不同程式語言之間的差異才可消除, 先測到你的 dll 能正確 access 了, 再來移植到 C#, 可能可以少走一些冤枉路.

Paul, Chao @ Techware
点赞  2009-3-31 18:49
我也遇到类似问题。。。读没问题,就是写不行,也不报错。。。
点赞  2009-9-23 11:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复