2017-06-30 76 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

感謝您指出這一點。確實,字符集丟失了。我以前一定會意外刪除它。我可以自己弄清楚 - 傻我。感謝您的及時響應和提示 - 注意! –

相關問題