问题如下:
我现在接手别人的工作,驱动别人是用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,都没有成功,也是不报错,但发不了数据!
高手们帮忙啊!
紧急!
补充:
刚才说的那个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字节!
求助!
to: xqhrs232
关键是没办法debug啊,驱动不是我写的,那人已走!
代码都没得!
引用: 引用 3 楼 yolon3000 的回复:
to: xqhrs232
关键是没办法debug啊,驱动不是我写的,那人已走!
代码都没得!
比重写还麻烦。不知道里面是什么,没有经过验证,测试的DLL,现在拿来用,还是不要为好。
源代码都没有,只能自己重写
就算发现了问题,LZ你也修改不了啊
1. 不知你的 "驱动经测试可用" 是如何測試的??
2. C# 不會用, 不知你的 Setinfo.data = new Byte[4]; 與 C 中的 BYTE data[4]; 是否完全一樣, 建議你先用 evc 寫 native code 來做測試, 這樣不同程式語言之間的差異才可消除, 先測到你的 dll 能正確 access 了, 再來移植到 C#, 可能可以少走一些冤枉路.
Paul, Chao @ Techware
我也遇到类似问题。。。读没问题,就是写不行,也不报错。。。