我正在尝试编写等效于以下内容的C#:
typedef struct BATT_ID
{
UINT8 nBattID[8];
} BATT_ID, *PBATT_ID;
HANDLE g_hDevice;
// Connect to the driver
g_hDevice = CreateFile(L"BAT1:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
void GetBattID(PBATT_ID pBattId)
{
// ... snipped code to check g_hDevice is valid ...
DeviceIoControl(g_hDevice, SOMO650_PWR_GET_BATT_ID, NULL, 0, pBattId, sizeof(BATT_ID), dwByteReturn, NULL))
}
// once BATT_ID has been filled it can be formatted as follows
wsprintf(strInfo, TEXT("%02X:%02X:%02X:%02X:%02X:%02X"), BattID.nBattID[6], BattID.nBattID[5], BattID.nBattID[4], BattID.nBattID[3], BattID.nBattID[2], BattID.nBattID[1]);
该代码正在连接到Windows Mobile设备的电源驱动器,并尝试检索电池ID。
这是针对SoMo650的最新ROM版本的,并且Socket仅能够提供C语言的示例代码。
除了调用DeviceIoControl外,我可以成功完成所有事情(尽我所能),因为我不知道如何将BATT_ID结构转换为C#。
我猜想这是一个结构,DeviceIoControl期望我应该在看Marshal.PtrToStructure()的指针,但是我很少有C的经验,并且感觉很不深入。
任何协助将不胜感激。
最佳答案
最好使用具有电池控制功能的Smart Device Framework。.有关社区版的下载链接,请参见此处。
编辑:如果您仍然想要等效的结构,请看这里:
[StructLayout(LayoutKind.Sequential,Pack = 1)]
公共结构BATT_ID
{
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray,SizeConst = 8,ArraySubType = System.Runtime.InteropServices.UnmanagedType.I8)]
public int [] nBattId;
};
然后,在p /调用之前,您需要为“ DeviceIoControl”签名,如下所示:
[DllImport(“ coredll.dll”,EntryPoint =“ DeviceIoControl”,SetLastError = true)]
内部静态外部int DeviceIoControlCE(
int hDevice,
int dwIoControlCode,
byte [] lpInBuffer,
int nInBufferSize,
byte [] lpOutBuffer,
int nOutBufferSize,
ref int lpBytesReturned,
IntPtr lpOverlapped);
调用看起来像这样:
IntPtr ptr = IntPtr.Zero;
BATT_ID battId;
int sz = Marshal.SizeOf(battId.GetType());
ptr = Marshal.AllocHGlobal(sz);
Marshal.StructureToPtr(((BATT_ID)battId,ptr,false);
byte [] pBattId = ptr.ToPointer();
out int bytesReturned = 0;
DeviceIoControl(handle,IOCONTROL_ID,null,0,pBattId,sz,ref bytesReturned,IntPtr.Zero);
battId = Marshal.PtrToStructure(ptr,battId.GetType());
元帅FreeHGlobal(ptr);
我希望我有这个权利...
编辑#2:正如ctacke(谢谢!)指出我的代码示例是错误的...
无符号字节[8] battId;
DeviceIoControl(g_hDevice,SOMO650_PWR_GET_BATT_ID,null,0,battId,Marshal.SizeOf(battId),ref bytesReturned,IntPtr.Zero);