CeGetSystemInfo не заполняет структуру, переданную по ссылке

Я пытаюсь получить информацию об устройстве Windows Mobile из настольного приложения (написанного на C#). Я поискал в MSDN и обнаружил, что нужная мне функция есть в rapi.dll:

VOID CeGetSystemInfo (LPSYSTEM_INFO lpSystemInfo);

Параметр является указателем на структуру, которая определена следующим образом:

typedef struct _SYSTEM_INFO {
    union {
       DWORD dwOemId;
       struct {
          WORD wProcessorArchitecture;
          WORD wReserved;
       };
    };
    DWORD dwPageSize;
    LPVOID lpMinimumApplicationAddress;
    LPVOID lpMaximumApplicationAddress;
    DWORD dwActiveProcessorMask;
    DWORD dwNumberOfProcessors;
    DWORD dwProcessorType;
    DWORD dwAllocationGranularity;
    WORD wProcessorLevel;
    WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;

Вот как я сопоставил все это с управляемым кодом:

[DllImport("rapi.dll")]
public static extern void CeGetSystemInfo([MarshalAs(UnmanagedType.Struct)]ref SYSTEM_INFO info);

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
       internal PROCESSOR_INFO_UNION uProcessorInfo;
       public uint dwPageSize;
       public IntPtr lpMinimumApplicationAddress;
       public IntPtr lpMaximumApplicationAddress;
       public uint dwActiveProcessorMask;
       public uint dwNumberOfProcessors;
       public uint dwProcessorType;
       public uint dwAllocationGranularity;
       public ushort wProcessorLevel;
       public ushort wProcessorRevision;
}

[StructLayout(LayoutKind.Explicit)]
public struct PROCESSOR_INFO_UNION
{
       [FieldOffset(0)]
       internal uint dwOemId;
       [FieldOffset(1)]
       internal ushort wProcessorArchitecture;
       [FieldOffset(2)]
       internal ushort wReserved;
}

Когда я вызываю функцию, передающую структуру SYSTEM_INFO, ничего не происходит. Функция никаким образом не изменяет значения структуры. Я неправильно сопоставил структуру или что-то в этом роде?

заранее спасибо


person Raphael    schedule 10.02.2010    source источник
comment
Это действительно работает? Ваше управляемое определение PROCESSOR_INFO_UNION не соответствует тому, что находится в SYSTEM_INFO, смещение всех других ваших членов на 4 байта.   -  person ctacke    schedule 10.02.2010


Ответы (1)


Понятно!

rapi.dll необходимо инициализировать, вызвав функцию CeRapiInit, а затем, после всех ваших вызовов функций, вам нужно закрыть rapi, вызвав CeRapiUinit.

person Raphael    schedule 10.02.2010