2015-12-25 1 views
1

J'ai une DLL (C#) appelée par un système tiers.Comment je peux convertir le pointeur vide en struct en C#

Ce système appelle la fonction fnSys et passe en tant que pointeur de void en tant que paramètre. Maintenant, j'ai besoin de jeter ce vide * dans ma structure.

Mon code est:

public struct Menu 
    { 
     public string str1; 
     public string str2; 
    } 

    public static unsafe int fnSys(void* value) 
    { 
     if (value!=null) 
     { 
      System.Windows.Forms.MessageBox.Show("msg"); 
     } 

     return 1; 
    } 

Maintenant, lorsque l'appel système tiers cette fonction boîte de message apparaît, mais je ne peux pas comprendre comment puis-je convertir cette valeur en MenuItem. Aussi je essayé comme ceci:

Menu menu = (Menu)Marshal.PtrToStructure(value, typeof(Menu)); 

mais cela ne fonctionne pas.

Y a-t-il des moyens?

+0

* "ne fonctionne pas" * n'a pas de sens. Comment cela échoue-t-il? Oh, et afficher la structure C utilisée par l'appelant. –

+0

Cela ne devrait-il pas être juste 'Menu menu = (Menu) valeur;'? – AustinWBryan

Répondre

0

J'ai trouvé la solution:

[StructLayout(LayoutKind.Sequential, Pack = 1, Size=255, CharSet = CharSet.Ansi)] 
public struct Menu 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] 
    public string str1; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] 
    public string str2; 
} 

public static unsafe int fnSys(Menu value) 
{ 
    if (value!=null) 
    { 
     System.Windows.Forms.MessageBox.Show("msg"); 
    } 

    return 1; 
} 

StructLayout attribut laissez-nous de contrôler les champs de données en mémoire.

plus en détail cette link