2010-02-10 15 views
0

J'essaie d'obtenir des informations sur un appareil Windows Mobile à partir d'une application de bureau (écrite en C#). Je cherchai le MSDN et a constaté que la fonction que j'ai besoin est rapi.dll:CeGetSystemInfo ne remplit pas la structure transmise par référence

VOID CeGetSystemInfo (LPSYSTEM_INFO lpSystemInfo); 

Le paramètre est un pointeur sur une struct qui est deffined comme ceci:

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; 

Voici comment je mappé tout le code managé:

[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; 
} 

Lorsque j'appelle la fonction passant la structure SYSTEM_INFO rien ne se passe. La fonction ne modifie en rien les valeurs de la structure. Ai-je cartographié la structure incorrecte ou quelque chose?

Merci d'avance

+0

Est-ce réellement? Votre définition gérée de PROCESSOR_INFO_UNION ne correspond pas à SYSTEM_INFO, ce qui compense tous les autres membres par 4 octets. – ctacke

Répondre

0

Got it!

Le rapi.dll doit être initialisé en appelant la fonction de CeRapiInit puis après tout votre fonction vous appelle besoin de fermer la rapi en appelant CeRapiUinit