从c#调用非托管代码。使用IntPtr获取数据

时间:2017-06-30 11:30:21

标签: c# pinvoke unmanaged netapi32

我目前正在编写的应用程序存在一个奇怪的问题。我很确定我最近没有更改下面代码中的任何内容,但不知何故它停止了工作。 到了这一点。 我正在使用:

    function addc(sel) {

        alert(sel.options[sel.selectedIndex].text);
        count=0;
        var options = document.getElementById("select1").options;

        for (var i=0; i < options.length; i++) {

            if (options[i].selected) count++;
        }


        var tableRef = 
document.getElementById('items').getElementsByTagName('tbody')[0];
        var rowsAdd = tableRef.insertRow(tableRef.rows.length-1 == 
count);

        var str = document.getElementById("select1").value;
        strSplit = str.split(',');




        //  alert(idx);
         qty = Math.random();

           var newCell = rowsAdd.insertCell();

          newCell.innerHTML="<tr class='item-row'><td class = 'item-
name'><input style='width: 210px;' form ='billsave' class= 'form-
control input-sm'  type='text' id = 'feetype' name= 'feetype' 
value='"+strSplit[0]+"' required> </td></tr>";


          newCell = rowsAdd.insertCell();
          newCell.innerHTML="<tr><td class = 'item-name'><input form 
='billsave'  class= 'form-control input-sm' style='width: 210px;' 
type='text' id = '"+strSplit[1]+"' onblur = 
calc("+strSplit[1]+","+qty+"),totalIt()  name= 'charges' 
value='"+strSplit[1]+"'  required  ></td></tr>";


          newCell = rowsAdd.insertCell();
          newCell.innerHTML="<tr class='item-row'><td><input form 
='billsave' class= 'form-control input-sm' style='width: 200px;' 
type='text'  id = '"+qty+"' name= 'price'  required  ></td></tr>";

          newCell = rowsAdd.insertCell();
          newCell.innerHTML="<tr><td class=''><i class='fa fa-close' 
style='font-size:20px'  onclick='deleteRow(this)'></i></td></tr>";



    }

导入 NetApi32.dll 。我需要物理路径。 无法使用WMI和WinRM。 然后我有枚举和结构如下:

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

全部在

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

根据VS代码分析器分类。 我称之为:

 [SuppressUnmanagedCodeSecurity]
public static class SafeNativeMethods

运行上面的代码后,我没有收到任何错误或例外,但是, siGet Struct只有每个属性值的第一个字母。 哪个可能是问题?

1 个答案:

答案 0 :(得分:1)

默认字符集是Ansi,这是结构编组使用的内容。但是您选择了Unicode版本的功能。您还应该为结构指定字符集:

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

编组文本时的一些提示:

  • 每当您只看到字符串的第一个字符时,您应首先怀疑您将UTF-16文本解释为ANSI或UTF-8。
  • 每当您看到中文所在的文本时,您应首先怀疑您将ANSI或UTF-8文本解释为UTF-16。