2010-02-10 2 views
0

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

VOID CeGetSystemInfo (LPSYSTEM_INFO lpSystemInfo); 

Параметр является указателем на структуру, которая deffined так:

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, ничего не происходит. Функция не изменяет значения структуры каким-либо образом. Я неправильно отображал структуру или что-то еще?

Заранее благодарен

+0

ли это на самом деле работает? Ваше управляемое определение PROCESSOR_INFO_UNION не соответствует тому, что находится в SYSTEM_INFO, компенсируя все остальные члены на 4 байта. – ctacke

ответ

0

Получил!

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

Смежные вопросы