Возможно, вам лучше использовать Smart Device Framework , в котором есть элемент управления батареей ... см. Ссылку для скачивания для версии сообщества.
Редактировать: Если вы все еще хотите, чтобы pinvoke-эквивалент структуры выглядел здесь:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct 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)]
internal static extern 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());
Marshal.FreeHGlobal(ptr);
Надеюсь, у меня есть это право ...
Редактировать # 2: Как ctacke (спасибо!) Указал, что мой пример кода неправильный ...
unsigned byte[8] battId;
DeviceIoControl(g_hDevice, SOMO650_PWR_GET_BATT_ID, null, 0, battId, Marshal.SizeOf(battId), ref bytesReturned, IntPtr.Zero);