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

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

编辑:说三道四文库 发布时间:2017-12-18 01:59
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里
}
搞定,谢谢!
Web设计师必备的10款最佳排版工具 诺基亚CEO谈平板计划 Android为候选系统 244亿美元!戴尔公司正式完成私有化 对抗苹果 Facebook或推Find My Friends应用 前谷歌工程团队负责人:如何打造一个完美的产品 好消息!Google Drive可存储共享JavaScript等网站 Android Rivers:用Kotlin语言写出的新闻应用 辞旧迎新 老牌游戏开发商的移动进化之路 iSuppli:硬盘市场持续萎缩 大数据应用成重要市场 全球最大校园Hackathon:失败后,你能学到什么? 走进Evasi0n,越狱黑客如何拿到iOS权限 提升服务扩展性和冗余的八个编码方向 分析数据预测未来?数据挖掘绝不是大公司的专利 揭秘LinkedIn数据科学家如何工作 为什么响应式设计对SEO有好处? SpaceX团队:想登陆火星吗?学好C++吧 可穿戴设备:越来越清晰的苹果iWatch 苹果设计师:开发者们的应用图标设计对了吗? AWS兴起之路:尚未成功 仍需努力 John Carmack:我们为什么不开发Linux游戏 最具创新力公司50强:耐克居首 Web如何成为另一个应用商店 Adobe发布Photoshop1.0.1源代码 大数据时代正在到来 微软CFO:我们的移动战略没有“B计划” TIOBE 2013年2月编程语言排行榜:历经十月Java重返第一 为让用户亲身体验产品 谷歌年底或开零售商店 谷歌推Chrome API支持HTML5实现本地离线数据存储与同步 Ubuntu开发者预览版将于月底开放下载 因Java漏洞,Facebook遭受恶意软件攻击但未泄密 HTML5预测 取代本地App将成为可能 500分求菜单功能。 修改数据,提交保存老报错,纳闷~~~ 急!在RED HAT LINUX中怎么配置POP和STMP服务器? 散分呵呵 是真还是假,群众的眼睛是雪亮的! 求助:XP和2003双操作系统,XP用PQ分区后在2003里找不到? 500分求菜单功能。 treeview控件,如何让其点击结点后再从数据库中取得这个节点的下一层节点? 如何在SQL SERVER 2000导入mis.bak文件? HELP!一道规划问题的优化!源代码 虚心的小弟,散分(分不多) 在线等待!!sql 无法登陆 500分求菜单功能。 用VC写的dll在vb上怎么用? 这样的sql 怎样写 WIN2000和LINUX与APACHE的搭配的困惑 高分求助,各位进来帮一帮吧,有问题请教,急,急!!! 找不到包在线等 我就不相信CSDN没有高手,帖出代码求救!!! 在服务器端监视客户记录 怎样使用vc+soap kit调用web service,麻烦添加注解! 中国科普之我见(普鲁日尼科夫),一种局外人难得的评说,你一定要看! 怎么找到这个东西 jScrollPanel.getViewport这个里面的getViewport代表了什么?Viewport的作用是什么?谢谢 ███请问,如何判断"\\192.168.0.123\temp"这个目录是否存在?███ 谁可以告诉我如何通过msflexgrid实现查询? 高分相给! 迷茫啊................ 大家来看看1997--2002的历届Jolt震撼大奖名单~ mmqm.exe 篡改IE的问题。给分!! EJB设计模式.实战EJB.精通EJB......等等----一个超好网址 简单快速 资源不敢独占 拿出来分享 如何实现打印功能? 怎样才能填充由两条贝塞尔曲线围成的封闭区域,谢谢了 请教关于数据库连接的问题 在sstab控件上怎么动态添加控件! ★★★★★★应邀申请[专题开发]版主,谢谢大家支持!★★★★★★ 通过代理(采用XP自带internet共享)上网的奇怪问题! 怎样才能将3DMAX做的动画嵌入到DELPHI7中,各位求救啦!? 请教一个困扰我好长时间的问题? 【回复被误删,导致本人满性欲降低,悲痛欲绝,请版主回复本人性欲】 如何判断窗体已经Unload,但还没有成为Nothing? 怎样修改jboss-3.2.1_tomcat-4.1.24的端口号,请多指教 word文档怎么打不开 HELP!一道规划问题的优化! 问题描述(太长了,只好发到2个贴子) 怎么找到这个东西 怎样将一个16进制的数转换为2进制 刚接触vc,有关List Box控件的问题 你用手机上过网吗,怎么设置的? 你用手机上过网吗,怎么设置的? 为什么能安装98却装不了2000? QQ密码保护问题忘了……咋办? 如何在Jbuilder的数据驱动下拉菜单中得到微软的SQL server 驱动 FCR under notify party address showing unit 206-3165 I/O unit 31 206 85.这是银行拒付通知中的不符点,I/O unit是什么? 怎样准备英语六级 我头都大了 《忆江南》和《游园不值》都事描写春天的吗? 国外要我做WES成绩单的认证,但是我删了几门课,教务处也知道,现在很担心教育部能不能查出来我所有成绩啊 请问:空调1、2、3、4、5匹各用多少安的空气开关和多少平方的线?怎么计算的? 尿比重偏高怎么办做了尿常规,尿比重偏高,尿液好多白色泡沫,有前裂腺炎症,由于应酬关系,吃药期间有的坚持用药十来天,有的坚持一个月左右就放弃,期间应酬免不了要喝酒.之后就都是自己 为什么赤道地区的重力加速度较小 dota2匹配机制是什么样的啊?我感觉匹配机制很坑爹,每次我都是输的一方打的最好的,结果还要被匹配跟傻逼一队,一直在输,神啊,为何,一直在输啊,一跟朋友联机,就看对面5人黑团 DOTA2的匹配机制是不是变了?以前不是把胜率控制在50%吗?怎么挂了20几局还是输,根本匹配不到水平低的? dota2匹配机制的问题…为什么半个小时都配不上?一个人匹配快还是组队快?有没有人知道啊… 从A={1,0}到B={-1,3,5}可以建立多少个函数【加急, 上海居民沈勇死亡 官方:正在组织调查黎巴嫩北部教派冲突伤亡人数升至50多联合国人权理事会工作组通过审查中国人意大利媒体称英美合作监控意通讯 政府白俄罗斯总统提议格鲁吉亚重返独联体遭马达加斯加总统选举平稳结束郝柏村:抗日战争的胜利属于整个中华民马尼拉市长拟为人质事件筹集2000万第九届两岸经贸文化论坛今举行 为交流明星进入考题屡见不鲜 “杨幂题”引争赵本山亮相春晚节目一审 冯小刚今答网市民之声林青霞:人生最孤单是嫁人前的半年“天降美食·吃遍全球500强”启幕林丹离开,还有谌龙 李宗伟真是“千年核心区周边空气不会对人体造成次生灾害新品播报遗体在京火化中南民大换寝室7000学生将大挪移图文:懵了 新车与赃车发动机“撞号”如山父爱 感动众多市民传达贯彻全国全省安全生产电视电话会议仙路之巅魔法震天鬼噬阴阳异界医仆非主流游戏幻想天地之玄重生之我是化学家神父特蕾莎网游之矿工也拔刀辉煌王朝为仙之道象头山旅游洲际酒店观景台旅游晋商博物馆旅游万寿谷旅游吞力黑衣壮民族风情园旅游丹凤门大街旅游洛阳丽景门旅游蒙牛工业旅游旅游信义坊步行街旅游翠峰山旅游白水带旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘