2013-02-18 2 views
2

je le c suivant ++ structComment convertir LParam struct en C#

typedef struct { 
    char szAccountNo[11];   
    char szAccountName[40];  
    char act_pdt_cdz3[3];   
    char amn_tab_cdz4[4];   
    char expr_datez8[8];   
    char granted;     
    char filler[189];    
}ACCOUNTINFO; 

typedef struct { 
    char szDate   [14]; 
    char szServerName [15]; 
    char szUserID  [8];  
    char szAccountCount [3];  
    ACCOUNTINFO accountlist [999]; 
}LOGININFO; 

typedef struct{ 
    int  TrIndex; 
    LOGININFO *pLoginInfo; 
}LOGINBLOCK; 

et converti en classe C#

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
     public class ACCOUNTINFO 
     { 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
      public string szAccountNo;  
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] 
      public string szAccountName;   
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)] 
      public string act_pdt_cdz3;  
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
      public string amn_tab_cdz4;  
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] 
      public string expr_datez8;   
      public char granted;     
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 189)] 
      public string filler;   
     }; 
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
     public class LOGININFO 
     { 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] 
      public string szDate; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)] 
      public string szServerName; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] 
      public string szUserID; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)] 
      public string szAccountCount; 
      [MarshalAs(UnmanagedType.Struct, SizeConst = 99)] 
      public ACCOUNTINFO[] accountlist; 
     }; 
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
     public class LOGINBLOCK 
     { 
      [MarshalAs(UnmanagedType.I4)] 
      public int TrIndex; 
      [MarshalAs(UnmanagedType.Struct, SizeConst = 1)] 
      public LOGININFO pLoginInfo; 
     }; 

je les deux méthodes suivantes pour convertir le LParam dans le WndProc.

1. TrStruct.LOGINBLOCK lb = new TrStruct.LOGINBLOCK(); 
         lb = (TrStruct.LOGINBLOCK)m.GetLParam(typeof(TrStruct.LOGINBLOCK)); 

2. TrStruct.LOGINBLOCK lb = (TrStruct.LOGINBLOCK) Marshal.PtrToStructure(m.LParam, typeof(TrStruct.LOGINBLOCK)); 

Cependant, il ne reçoit pas le succès ni émet un message d'erreur régulière, au lieu que je reçois le message « Une première exception chance de type « System.TypeLoadException » est produite dans mscorlib.dll » dans la fenêtre de sortie. Quelqu'un pourrait-il me dire ce qui ne va pas avec ma conversion?

+1

Pour commencer, votre jeu de caractères est ascii, pas unicode. Utilisez également le mot clé 'fixed' pour les tableaux de valeurs. – leppie

+0

@leppie Je ne comprends pas en utilisant un mot-clé fixe pour les tableaux de valeur. Pourriez-vous être plus précis ou donner un exemple? – icewall

+0

Voir http://msdn.microsoft.com/en-us/library/zycewsya(v=vs.80).aspx – leppie

Répondre

0

Le premier problème apparent avec votre code réside dans CharSet.Unicode. Les champs de votre structure dans le code non managé sont tous définis comme char qui est un caractère à un octet. Vous devriez utiliser CharSet.Ansi pour toutes vos structures. Le deuxième problème est dans le dernier champ de LOGININFO. Elle est définie comme

[MarshalAs(UnmanagedType.Struct, SizeConst = 99)] 
public ACCOUNTINFO[] accountlist; 

mais dans votre code non managé, il est

ACCOUNTINFO accountlist [999]; 

Le paramètre SizeConst doit être modifié pour 999.

+0

J'ai essayé toutes les solutions que vous avez fournies, mais cela ne fonctionne pas comme avant. D'autres suggestions? – icewall