2017-06-30 114 views
0

我正在编写的应用程序有一个奇怪的问题。我很确定我最近没有在下面的代码中改变任何东西,但不知何故它停止了工作。 重点。 我使用:从c#调用非托管代码。使用IntPtr获取数据

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

要导入的netapi32.dll 。我需要物理路径。 WMI和WinRM不能使用。 然后,我有枚举和struct如下:根据VS代码分析器

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

所有在

[SuppressUnmanagedCodeSecurity] 
public static class SafeNativeMethods 

类。 我把它叫做:

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)); 

上面的代码运行我没有收到任何错误或异常后,然而,siGet结构有每个属性值只有第一个字母。 哪里可能是问题?

+0

请参阅SHARE_INFO_502的声明:http://www.pinvoke.net/default.aspx/Structures.SHARE_INFO_502 – PaulF

回答

1

默认字符集是Ansi,这就是结构编组所使用的。但是你选择Unicode版本的功能。编组文本时

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

一些提示:

  • 每当你看到的只是一个字符串的第一个字符,你首先应该怀疑你有UTF-你还应该指定字符集的结构16文本解释为ANSI或UTF-8。
  • 只要你看到中文在你期望的英文的文本,你应该首先怀疑你已经将ANSI或UTF-8文本解释为UTF-16。
+0

感谢您指出这一点。确实,字符集丢失了。我以前一定会意外删除它。我可以自己弄清楚 - 傻我。感谢您的及时响应和提示 - 注意! –

相关问题