说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

用C#调用packet.dll里的函数出错,请高手帮忙调一下!

编辑:说三道四文库 发布时间:2017-03-23 12:43
HTML文档下载 WORD文档下载 PDF文档下载
packet.dll里有个函数PacketGetAdapterNames,带两个参数sStr和bufferSize,一个是存放网卡信息的缓冲区,另一个是缓冲区大小。我写一段代码运行之后函数已经返回true了,bufferSize也被改了,但是sStr没变。代码贴在下面了,很着急,请哪位高手帮忙调一下,谢谢!




    public partial class Form1 : Form
    {
        [DllImport("packet.dll",EntryPoint="PacketGetAdapterNames",CharSet=CharSet.Ansi)]
        public static extern bool PacketGetAdapterNames([MarshalAs(UnmanagedType.LPStr)]string sStr, ref int BufferSize);
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bool b = false;
            int length = 40;
            string an = new string('0',length);
            b = PacketGetAdapterNames(an, ref length);
            NetworkInterface[] ni = NetworkInterface.GetAllNetworkInterfaces();
            label1.Text = an;
        }
    }

你PacketGetAdapterNames函数的原型是什么? 

public static extern bool PacketGetAdapterNames([MarshalAs(UnmanagedType.LPStr)]string sStr, ref int BufferSize);

你这样的调用方式sStr肯定是不会改变的。、
你的C函数原型中该位置要么是char** sStr,要么是char*&.这样才能改变传进来的值。
C#中相应处也应该是类似ref string..
感谢!不过函数的原型是LPStr string,昨天晚上试了一晚上,忘了试的是ref string还是ref char[]了,好像都不行,中午回宿舍才能再试,呵呵!
什么叫 LPStr   string,我问你的C++函数的原型是什么?
以前只用过C++开发过WinPcap的东东

第一个参数可以用这个试试:


//声明:
[DllImport("packet.dll",EntryPoint="PacketGetAdapterNames",CharSet=CharSet.Ansi)]
public static extern bool PacketGetAdapterNames(StringBuilder adapterName, ref int BufferSize);

//使用:

while (1)
{
    StringBuilder sb = new StringBuilder(260);
    int bufLen = 260;

    if (PacketGetAdapterNames(sb, ref bufLen))
    {
        // 做你想做的事,比如把得到的网卡名放到一个List里
     }
    else
    {
        break;
    }
}
其实CharSet=CharSet.Ansi 这个不该设置,我拷贝楼主的代码时没注意
不设置应该默认Auto

还有可能用户机器会有不止一个网卡(比如用VM虚拟机),所以需要在一个循环里读取,直到枚举完为止
楼上的大哥,按你的方法还是没返回正确的结果,sb里面是空的,无奈啊。。。。。。
麻烦大家说说自己用的WinPcap都是哪一版的啊?我又试了4.01、02、03这三个版本的,都不行
为了解决你问题,你又不肯给出函数的原型,自己搜了一下
PacketGetAdapterNames ,。你的问题出在,string sStr 这个是WCHAR * 类型,所以是宽字符的,所以

([MarshalAs(UnmanagedType.LPWStr)]string sStr
楼上的大哥实在是不好意思,我在Packet32.h里面看到的sStr类型为PTSTR,试着用你的方法改我的程序,同样得不到网卡名字列表。我想知道这个函数返回的网卡名字到底是注册表中的那个键值?知道的话就可以用C#里面自带的函数了,我的目的很简单,就是要找到网卡的名字然后打开它用它给交换机发送数据包。
在WINDOWS头文件中定义如下,、
typedef LPWSTR PTSTR, LPTSTR;
typedef __nullterminated NWPSTR, *LPWSTR, *PWSTR;

所以PTSTR 就是WCHAR *。

奇怪。你的字符集CharSet=CharSet.Unicode,数据类型用StringBuilder也不行。。?
都试过了啊,就是不行,运行之后b的值能改成true,length能变成242,就是an不变,还有什么办法能得到网卡名字吗?
有个问题:
你的机器上要先安装同版本的WinPCAP驱动才行
否则光用dll是得不到的
还有没有发现楼主有初始化pcap lib啊?!
你看看.h头文件,应该先调用初始化库的函数  然后再调用其他功能函数
这个我记得不是很清了,也许你用的这个函数无需初始化pcap库
up
回palmax大哥,我装winpcap了,小弟才疏学浅,还不知道C#里面初始化库的函数怎么写,pcap lib库具体在什么地方
转化成byte数组再传过去吧

            //声明:


                        [DllImport("packet.dll",EntryPoint="PacketGetAdapterNames",CharSet=CharSet.Auto)]
public static extern bool PacketGetAdapterNames(ref byte[] adapterName, ref int BufferSize);

//使用:

while (1)
{

    if (PacketGetAdapterNames(sb, ref bufLen))
    {
      //把byte数组转化为你要的字符串
        // 做其他事
     }
    else
    {
        break;
    }
}
楼主:

昨天上网查了下,你的这个PacketGetAdapterNames函数是不用其他初始化的,它是第一个要调用的函数,它是读注册表的,返回的sStr是网卡名的连续字符串,中间用一定的字符来分隔的,我现在手里没PCAP的环境,要不你再试试:

//声明:
[DllImport("packet.dll",EntryPoint="PacketGetAdapterNames",CharSet=CharSet.Auto)]
public static extern bool PacketGetAdapterNames([MarshalAs(UnmanagedType.LPStr)]StringBuilder adapterName, ref int BufferSize);

//使用:
StringBuilder sb = new StringBuilder(4096);
int bufLen = 4096;

if (PacketGetAdapterNames(sb, ref bufLen))
{
    // 做你想做的事,比如把得到的网卡名放到一个List里
}
搞定,谢谢!
ListBox项的控制-VB资料 VB 6.0中类聚集关系的实现 VB6编程中如何获取硬盘分区信息 VB的坐标系统综述 VB调用C程序动态链接库的方法 VB对低层硬件的访问控制 VB软件开发中的错误捕获及处理技术 VB中Combo的一种输入检查制约方法的实现 VB中Winsock控制的UDP协议的使用 VB中的时间处理问题 Windows操作平台下CGI的实现 -VB资料 按下某组键(HotKey)便执行某程式-VB资料 把所有的字体名称放到 ComboBox -VB资料 把文件置入到Text或RichText中-VB资料 捕捉 MouseExit 事件 -VB资料 操作过程动态显示 -VB资料 查找月份的最后一天-VB资料 程序启动时,如何自动判断 MDB文件是否损坏并自动修复?-VB资料 读取和修改Windows注册表 -VB资料 对VB的IDE环境的扩展 防止文本控件中的部分滚动-VB资料 关闭正在运行的程序 -VB资料 关机消息的拦截 -VB资料 VB获得、设置鼠标双击间隔时间 VB获取当前系统平台 记载Windows使用的时间-VB资料 加速Visual Basic For Application(VBA) 监视程序的运行情况 -VB资料 交换鼠标按钮 -VB资料 交换鼠标左右键 -VB资料 禁止使用 Alt-Tab 或 Ctrl-Alt-Del -VB资料 把播放F4的时间上《我们程序员都是活雷锋》 随便问问:VC能不能调用Access中的Form,Report 用ADO在线程中打不开数据库,请帮忙 如何在VB中动态的加载Dll,并使用其加载的函数??? 高手们看过来 Oracle初学,兄弟们多帮忙了! 怎么打开一个.txt文件,然后一行一行读取? 请问大家知道一个局域网里的IP在因特网上如何表示的呢。 请问各位,如何在我的程序中用代码生成Access数据库? 神啊,救救我吧,我想要含笑半步喋=== 请教NT4。0下的IE2。0怎样升级到IE6。0或IE5。0? 我要在程序中重载CBitmap类的一个函数,请问如何做 为什么我在bcb的new中找不到multitier(就是多层)选项页 请问如何知道数据库中有哪些表存在?在线等待 向各位大侠求救中 这是数据库的缺点吗? Choice.asp?VehicleType=a+&VehicleColor=Red + 传不到Choice.asp 如何获取文件扩展名关联信息 急!应选择什么样的服务器? 请问哪里有关于DOS和BIOS的系统功能调用的e书籍下载?谢谢指点 想用bcb的DirectX编一个显示器(第二个)的独占程序!希望专家指点!也欢迎大家来交流! 你碰到过这样的问题吗? What is meaning "$1 $2 " in perl? 配置支持ISAPI调用的 apache 服务器 怎样判断内存有没有被释放? window2000的安装和IE的问题 像我這樣的Boy,是否可以找到GF??? Oracle816连接问题,急 小妹有一事相求,请问哪里有SQL Server 7.0 的虚拟光盘下载啊?急!!! 谢了! Delphi的枚举类型是怎么用的?如果它的元素是字符串,怎样判断它和某个字符串相等? 我以前是用Delphi的,现在新找了家公司,是用C++Builder的,请帮忙推荐本C++Builder的书,谢谢 请问如何实现多媒体数据库??? SQL Server 7.0作为后台,它主要完成什么功能??!!求救!!!!!!! 请教WebUIValidation.js'的作用 2000 server 的 IE 的非法操作?(如果是非技术的,也请斑竹手下留情。) 求助:开发一个小型数据库,使用那种哈希函数适宜 如何调用IE的缓存 如何获取文件扩展名关联信息 小妹有一事相求,请问哪里有SQL Server 7.0 的虚拟光盘下载啊?急!!! 谢了! VC下通过ADO查询Oracle数据集个数为何返回为-1?? 请大家看看pb65自带的例子 很简单的问题,如何将EXCEL中的数据转换到ACCESS2000中,需源程序(一) 在ASP中如何将一字符型转为数据型??在VB中可用VAL,CINT,CDBL等,ASP中却不能?? 为什么安装jdk1.4,path中设置了jdk\bin路径后,appletviewer命令不出现applet窗口?? adodataset连接的问题? 请问带有图片,文字,和菜单的按钮(就像IE里,前进后退的按钮)用哪个现成的类 连接sql server数据库时出现的问题 shell编程的一个小……………………问题。 new 和delete的问题,调试错误。。。。 要在DBGrid中选中多项,除了用Ctrl和鼠标组合,还有没有别的方法? 最简单的问题,指针赋值。 一次远足中,一部分人步行,速度为5千米每小时,另一部分人做汽车,速度为每小时60千米,步行者比汽车提前一小时出发,这辆汽车到达目的地后,再回来接步行的这部分人.出发地到目的地距离为60 汽车由静止出发做匀加速直线运动,6s后改做允速直线运动4s,然后刹车改做匀速直线运动3s停止,全程共经过153m,求:1、汽车刹车后的加速度;2、车在第12s末的速度.这个问题有人这么回答1、-6m/ 要除去一溶液中的杂质,要怎么知道加入适量的什么才能除去.比如要除去NaCl中混有的少量Na2Co3,你是怎么知道加稀盐酸才能除去 某物体由静止开始作匀加速直线运动.加速度大小为a1.运动时间为t1.接着作加速度大小为a2的匀减速运动.再经过t2速度恰好为零.则物体在全过程的平均速度可表示为?为什么0.5a1t1和0.5a2t2 也对 中世纪西欧宗教对当时的科技,社会的影响拜托了!急呀!. 除去氯化钠溶液中的少量的碳酸钠,可加入适量的..A.石灰石 B.氯化钠溶液 C.硝酸 D.氯化钙溶液 如何鉴别碳酸铵,硫酸铵和尿素以及方程式 全国人大闭会期间,全国人大常务委员会对全国人大制定的法律能否修改或补充? 酸,碱,盐在水溶液中发生的复分解反应,实质上是?这类离子反应发生的条件是? 如何鉴别氯化铵和尿素?用硝酸银和稀硝酸可以吗? 西欧中世纪建筑风格 酸、碱、盐在溶液中进行的复分解反应,如果有什么,或有是,或有什么.这时复分解反应就可以发生,否则酸、碱、盐在溶液中进行的复分解反应,如果有____,或有____ 或有____.这时复分解反应就可 008年全国人大通过《关于修改的决定》,征收个人所得税的起点从1600元提高到2000元,也就是说,原来月收入超过1600元的部分为全月应纳税所得额,提高到月收入超过2000元的部分为全月应纳税所 目前中华人民共和国全国人大及其常务委员会共制定多少部法律.地方法律法规不算,只要全国法律. 酸、碱、盐在水溶液中发生的复分解反 应,实质上是______.这类离子反应发生 的条件是____________,只要具备上述条件 之一,反应就能发生. 2000年10月31日,第九界全国人大常务委员会第十八次会议通过的《中华人民共和国国家通用语言文字》所称的国家通用语言文字是什么 全国人大及常委会制定的税收法律有哪些?以及 授权国务院制定的又有哪些? 酸、碱、盐间发生复分解反应的条件是 用碳酸氢钠吸收二氧化硫,二氧化硫少量和多量时的反应方程式分别是? 西欧中世纪 1.采邑改革中形成的层层分封不会使国家土地的不断分割,为什么还会形成大的庄园经济啊?2.封建等级制中封建主的势力坐大,这是否就必然会形成封建割据呢?3.中世纪时的大学说 酸 碱 盐之间发生的反应 什么 什么 什么 什么是复分解反应 二氧化硫与小苏打反应的方程式如题 西欧中世纪的历史简介 西欧的封建社会何以称为“中世纪”是西欧封建社会称为“中世纪”,不是一个时间的概念哦~~~ 碳酸氢钠与二氧化硫的反应方程式 煤气灶具是玻璃面板的好还是不锈钢的好呢?我想买一台灶具,本想买玻璃的,但商家都告诉我玻璃的容易裂,还是不锈钢的好,请问各位大侠是这样么 要除去NaCl溶液中所含少量Na2CO3,得到纯净的食盐水,可向溶液中加入适量的[ ]A、Ba(OH)2 B、CuSO4 C、CaCl2 D、盐酸 中世纪西欧人的书写材料主要是: 要除去NACL种混有少量NA2CO3,最好加如适量的( )A水 B 氢氧化钙 C 硫酸 D 稀盐酸可用CACO3表示的一组物质是( )A 大理石 石灰石 B 石灰石 熟石灰C 大理石 生石灰 D 熟石灰 生石灰 在酸,碱,盐的水溶液里能够自由移动的电荷上什么和什么? 我想做点胶水,里面要用到二辛酯 和 乙二醇 它们在里面各起什么作用? 混在氯化钠中的碳酸钠怎样消除 酸、碱、盐的水溶液中,能自由移动的电荷是?怎么判断啊? 全国人民代表大会及其常务委员会.全国人大常委会的区别是什么?还有个问题,这是一道题:2010年10月28日,十一届全国人大常委会第十七会议表决通过修改后的《中华人民共和国村民委员会组 氯化钠溶液中,混有少量碳酸钠,用什么物质去除碳酸钠? 酸、碱、盐的水溶液中,能自由移动的电荷是哪两种 请问全国人民代表大会、全国人大常务委员会和全国人大常委会的区别和关系?全国人大常务委员会就是全国人大常委会吗? Na2CO3中混有少量NaCl,除杂.RT,最好简单易行 电子绕核高速运动.酸,碱,盐的水溶液中的自由电荷是( ) 和( ). 全国人民代表大会和全国人大常委会的区别?我的理解是,因为全国人民代表大会是国家的最高权力机关,一年召开一次.那么平常还是需要有人来管事,人大就选一些人组成全国人大常委会.那么, 地铁和汽车直线那个快,绝对速度 金属导体中的自由电荷是------,酸、碱、盐水溶液中的自由电荷是----- 中共中央政治局常委会和全国人大的关系 碳原子数为10或小于10的烷烃分子中,其一卤代物不存在同分异构体的烷烃分子有几种 A 2 B 3 C 4 D 5 怎样除去氯化钠溶液中的碳酸钠?方法是?反应方程式?都要回答清楚的。 全国人大常委会和全国人民代表大会哪个大 氢氧化钠 碳酸钠 氢氧化钡 三种无色溶液 用一种试剂 鉴别的方法 全国人大审议通过《关于修改的决议》是行使______权注意书名号~=V=thanks 现行宪法规定,有权制定基本法律的机关是() A全国人民代表大会 B全国人大及其常务会这里的“基本法律”指的是那些法律,不是全国人大制定的法律才是基本法律吗? 怎样判断酸、碱、盐 导电性的强弱? 全国人大表决通过关于修改《选举法》的决定是在行使什么权 一辆车以40公里时速行走一段时间后,在以60公里时速返回,请问平均数度是多少,谢谢了我要面试考生这个题目! 怎样判断导电性的强弱 2010年3月,十一届全国人大三次会议表决通过了关于修改选举法的决定.体现了法律的什么特征 中世纪西欧的城堡介绍关于城堡的各个方面外面和里面的结构 功能.要全面些 化@~判断导电性强弱怎么判断其强弱?一题中:下列物质属于非电介质,但放入水中所得溶液导电性明显增强的是?A乙醇 B:三氧化硫A为什么不可也? 第十一届全国人民代表大会第三次会议做出关于修改选举法的决定,实行城乡按相同人口比例选举人大代表,符合各族人民的共同利益,更好地体现了人人平等,地区平等,民族平等的原则.请问这 全国人大和人大常委各颁布哪些法律? 怎么判断金属导电性的强弱? 全国人大通过选举法修正案体现了中国全国人大怎样的性质和职权?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘