Вызов неуправляемого кода из 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 не могут быть использованы. Тогда у меня есть enum и struct, как показано ниже:

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

Класс согласно анализатору кода VS. Я называю это с:

 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 Struct имеет только первую букву каждого значения свойства. Где может быть проблема?

1 ответ

Решение

Набор символов по умолчанию Ansiи это то, что использует структура маршаллинга. Но вы выбираете версию функции Unicode. Вы также должны указать набор символов для структуры:

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

Несколько советов по составлению текста:

  • Всякий раз, когда вы видите только первый символ строки, вы должны сначала подозревать, что текст UTF-16 интерпретируется как ANSI или UTF-8.
  • Всякий раз, когда вы видите текст, который выглядит по-китайски там, где вы ожидали английский, вы должны сначала подозревать, что у вас есть текст ANSI или UTF-8, интерпретируемый как UTF-16.
Другие вопросы по тегам