2017-06-30 11 views
0

J'ai un problème étrange avec l'application que je suis en train d'écrire. Je suis à peu près sûr que je n'ai rien changé récemment au code ci-dessous, mais de toute façon ça a cessé de fonctionner. Au fait. J'utilise:Appelez du code non géré à partir de C#. Obtenir des données à l'aide IntPtr

[DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    public static extern uint NetShareGetInfo(
     string servername, 
     string netname, 
     int level, 
     out IntPtr ppBuf 
     ); 

Pour importer netapi32.dll. J'ai besoin de chemin physique. WMI et WinRM ne peuvent pas être utilisés. Ensuite, je dois ENUM et struct comme ci-dessous:

public enum ShType 
    { 
     DiskTree = 0, 
     PrintQ = 1, 
     Device = 2, 
     IPC = 3, 
     Temporary = 0x40000000, 
     Special = unchecked((int)0x80000000) 
    } 
    public struct SHARE_INFO_502 
    { 
     public string Name; 
     public ShType Type; 
     public string Remark; 
     public int Permissions; 
     public int MaxUses; 
     public int CurrentUses; 
     public string Path; 
     public string PassWd; 
     public int reserved; 
     public IntPtr SecDescriptor; 
    } 

tous dans

[SuppressUnmanagedCodeSecurity] 
public static class SafeNativeMethods 

classe selon analyseur de code VS. Je l'appelle avec:

IntPtr ptrGet; 
var resGetInfo = SafeNativeMethods.NetShareGetInfo("server_name", "share_name", 502, out ptrGet);    
SafeNativeMethods.SHARE_INFO_502 siGet = (SafeNativeMethods.SHARE_INFO_502)Marshal.PtrToStructure(ptrGet, typeof(SafeNativeMethods.SHARE_INFO_502)); 

après l'exécution de code ci-dessus, je ne reçois pas d'erreurs ou des exceptions, toutefois, Siget a seulement Struct première lettre de chaque valeur de la propriété. Où pourrait être le problème?

+0

Voir ce pour la déclaration de SHARE_INFO_502: http://www.pinvoke.net/default.aspx/Structures.SHARE_INFO_502 – PaulF

Répondre

1

Le jeu de caractères par défaut est Ansi, et c'est ce que le rassemblement struct utilise. Mais vous optez pour la version Unicode de la fonction. Vous devez également spécifier le jeu de caractères pour la struct:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct SHARE_INFO_502 
.... 

Quelques conseils lorsque le texte marshalling:

  • Chaque fois que vous voyez que le premier caractère d'une chaîne, vous devez d'abord croire que vous avez UTF- 16 texte interprété comme ANSI ou UTF-8.
  • Chaque fois que vous voyez le texte qui ressemble chinois où vous attendiez l'anglais, vous devez d'abord croire que vous avez texte ANSI ou UTF-8 interprété comme UTF-16.
+0

Je vous remercie de l'avoir signalé. En effet, le jeu de caractères était manquant. Je dois avoir accidentellement supprimé il y a longtemps. J'aurais pu comprendre par moi-même - idiot moi. Merci pour la réponse rapide et les conseils - notés! –