struct USMC_DEVICES_stは、次のようなものに変換されます。
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
struct USMC_DEVICES_st
{
public UInt32 NOD;
public IntPtr serial;
public IntPtr Version;
}
シリアルとバージョンへのアクセスは、次のようなコードで実行できます。
IntPtr ser;
for (var i = 0;
(ser = Marshal.ReadIntPtr(um.serial, i)) != IntPtr.Zero;
i += Marshal.SizeOf(ser))
{
var serial = Marshal.PtrToStringAnsi(ser);
}
編集-ここでのコメントに続いて、構造体のメンバーにアクセスするためのより詳細な例を示します。
static void PrintDevices(USMC_DEVICES_st um)
{
const int serialSize = 16;
const int verSize = 4;
int j = 0;
for (var i= 0; i < um.NOD; i++, j+= IntPtr.Size)
{
var ser = Marshal.ReadIntPtr(um.serial, j);
var ver = Marshal.ReadIntPtr(um.Version, j);
// ensure we check for null pointers - just in case
if (ver == IntPtr.Zero || ser == IntPtr.Zero) break;
Console.WriteLine("Device {0}, \tSerial number {1}",
Marshal.PtrToStringAnsi(ser, serialSize),
Marshal.PtrToStringAnsi(ver, verSize));
}
}