我正在尝试编写等效于以下内容的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);

08-06 18:26