【发布时间】:2014-03-18 12:11:24
【问题描述】:
我在WIN CE平台上工作,用C#.Net开发windows窗体。
DeviceIoControl API 与 c++ 控制台应用程序中的参数(如下所述)一起工作正常。
nuiouser.h 中的 PNIC_STATISTICS 结构
global declarations :
TCHAR PCI1_NAME[] = _T("PCI\\ManiXX1");
TCHAR *AUB_NAME = NULL;
AUB_NAME = PCI1_NAME;
pNICStat = (PNIC_STATISTICS)malloc(sizeof(NIC_STATISTICS)) ;
pNICStat->ptcDeviceName = AUB_NAME ; //wchar_t* ptcDeviceName
DeviceIoControl( hUB94Port, //void*
IOCTL_NDISUIO_NIC_STATISTICS,
pNICStat, //PNIC_STATISTICS
0,
pNICStat, //PNIC_STATISTICS
sizeof(NIC_STATISTICS),
&dwReturnedBytes,
NULL
);
但是我在使用 C#.Net CF for WIN-CE7 实现相同的问题时遇到了问题
我的WIN-CE代码如下:
C# 中的修改结构:
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct __NIC_STAT
{
ulong Size; // Of this structure.
public Char[] ptcDeviceName; // The device name to be queried..
ulong DeviceState; // DEVICE_STATE_XXX above
ulong DeviceState; // DEVICE_STATE_XXX above
ulong MediaType; // NdisMediumXXX
ulong MediaState; // MEDIA_STATE_XXX above
ulong PhysicalMediaType;
ulong LinkSpeed; // In 100bits/s. 10Mb/s = 100000
UInt64 PacketsSent;
UInt64 PacketsReceived;
ulong InitTime; // In milliseconds
ulong ConnectTime; // In seconds
UInt64 BytesSent; // 0 - Unknown (or not supported)
UInt64 BytesReceived; // 0 - Unknown (or not supported)
UInt64 DirectedBytesReceived;
UInt64 DirectedPacketsReceived;
ulong PacketsReceiveErrors;
ulong PacketsSendErrors;
ulong ResetCount;
ulong MediaSenseConnectCount;
ulong MediaSenseDisconnectCount;
} ;
从这个结构中,我只是填写 ptcDeviceName 并尝试发送。
__NIC_STAT NIC_STAT = new __NIC_STAT();
Char[] toBytes = {'P','C','I','\\','M','a','n','i','X','X','1','\0'}
NIC_STAT.ptcDeviceName = toBytes; //public Char[] ptcDeviceName; in structure
// __NIC_STAT this is the same structure as
//in nuiouser.h
int sz = Marshal.SizeOf(NIC_STAT.GetType());//sometimes Getting exception here
intptr ptr = Marshal.AllocHGlobal(sz);
Marshal.StructureToPtr((__NIC_STAT)NIC_STAT, ptr, false);
unsafe
{
DeviceIoControl(hFileHandle,
IOCTL_NDISUIO_NIC_STATISTICS,
ref ptr,
0,
ref ptr,
sz,
ref dwReturnedBytes,
0);
}//unsafe
对应的原型
[DllImport("coredll.dll", CharSet = CharSet.Auto, SetLastError = true)]
unsafe public static extern bool DeviceIoControl(
int hDevice,
int dwIoControlCode,
ref intptr InBuffer,
int nInBufferSize,
ref intptr OutBuffer,
int nOutputBufferSize,
ref int pBytesReturned,
int pOverlapped
);
在 Win-CE 中,DeviceIoControl() 失败,出现异常并且不显示任何错误代码。有时会收到错误代码为 87 (INVALID PARAMETERS)。
我觉得 ptcDeviceName 造成了问题,或者可能是因为为指针 (ptr) 分配内存?
在控制台应用程序中,我们将 ptcDeviceName 作为 Wchar_t* 发送,但在 WIN-CE 中,所以我使用了
public Char[] ptcDeviceName;
谁能告诉我哪里做错了?
【问题讨论】:
-
__NIC_STAT 在 C# 中定义它与 nuiouser.h 中的 PNIC_STATISTICS 结构相同的结构 @cacke ctacke
-
如果您隐瞒重要信息,我们如何为您提供帮助。我多次要求查看结构,但您不会显示它。
-
你没有显示结构。不是你的 C# 翻译。我不会再问了。
-
@arya2arya 你不明白,是吗?
// other parameter as in nuiouser.h没有有帮助。我们需要查看整个结构。请将其复制并粘贴到您的问题中。有那么难吗?你为什么不明白这是我们需要帮助的信息!? -
不知道为什么关闭,这是一个有效的问题,我完全理解。既然结构已添加到问题中,我也知道问题是什么(还有多个问题),但在重新打开之前我无法提供答案。
标签: c# .net windows-ce