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

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

编辑:说三道四文库 发布时间:2017-02-27 07:48
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里
}
搞定,谢谢!
创业建议泛滥成灾 实用的不多 腾讯云俱乐部北京站:知名手游商畅谈云时代开发运营策略 LG再战平板市场:将推出8.3英寸平板G Pad 编程语言与工具专题论坛:各类编程语言使用体会分享 淘宝、腾讯、豆瓣、支付宝、网易专家热议大数据分析与BI实战 “创新或灭亡”:Google的80/20只是转移视线的说辞罢了 自动化编排,配合SDN的iMC V7更加开放 [回顾]比尔·盖茨传奇的前半生 IT基础设施与运维论坛:IT基础设施及运维经验分享 记华为HCC2013 Day1:发力高端存储 HCC 2013虚拟化论坛:虚拟化未来发展方向 Windows 8操作系统市场份额增至7.41% Windows 7仍最受欢迎 【开源专访】Sea.js创始人玉伯的前端开发之路 SDCC 2013:阿里周宝方谈“去IOE”战略及实施 百度和高德:最后谁是地图的王者? 【CTO论道】瑞智和康CEO陶建辉:软硬结合是消费电子新潮流 10大高效率原型设计工具 JIRA与敏捷:李小龙教给我们的敏捷开发之道 百度开放云:Light Up The World,与开发者共享云未来 有胆你就来!11个在线编码大赛 CTO如何避免决策失控:第一步-定义角色 后机械硬盘时代,那些引领风骚的闪存初创公司 致远文杰:传统企业如何实现移动化转型? 记华为HCC2013 Day2:SDN开放编程系统OPS打造生态圈 HCC2013:华为FusionCube融合至简,性能至优 已确认Stephen Elop候选微软下任CEO 英语对于软件开发者来说到底有多重要? SDCC 2013中国软件开发者大会成功落幕 新浪微博宋琦:PHP在微博优化中的“大显身手” 8月份浏览器份额:IE浏览器PC端出现反弹 移动端跌出前五 如何让Ruby项目速度提升10倍 这个进制转换的程序写的很好~!但是我还是有点不明白的地方,请指教! 有什么好的学习vc的书呢?我对c++有点熟悉,能让我快速上手vc的书籍 ? 急!oracle management server无法启动啊! PB数据库的连接问题? 小问题,不知你能否解决? help,base64编码 大家好,我的问题很严重。。。 哪有mediaPlayer控件的中文开发资料,谢谢大家帮忙!!! 谁能和我说一下这个程序怎么作啊 寻找VRAMDir,在计算机应用文摘里写过! sql7+access的速度问题?大家的意见? 在CTreeCtrl中,如何知道用户点击已被选择了的Item? 哪里有bas5.0的下载??????????万分感激啊!! 打印问题谁能解决 谁用过‘北京利马公司’的ERP软件?评论??? 各位大哥帮帮我! 微软高手请进:CE下开发的三个(高难度)问题。。。 现在最好的jsp服务器是什么??最全面稳定的是哪一个?? 那位仁兄能给出一个24位bmp的图片转换成黑白的bmp图片的代码(别嫌分少啊) 对不住我的职业道德了…… 那位仁兄能给出一个24位bmp的图片转换成黑白的bmp图片的代码( 别嫌分少) 一个很菜的问题:怎样把文档类的数据传到CMainFrame 一个很有趣的问题,但是比较难哟,高手请进,一定给分!!!! 请问war是什么文件? 用LOTUS SCRIPT怎么样对修改一个文档中域的值?有没有代码? 各位,哪里有design patterns下载呀? 打印问题有谁能解决 十万火急,兄弟们过来帮帮忙........... 多字段模糊查询~~~谁会啊!! 高手请进 关于dialog和控件回车键消息处理的小问题 photoshop背景色的问题 虚函数能否做友元? const^:^ *********在dll文件中怎样打开一个窗口********* 自定义对话框 求解:怎样使用数据窗口能多页预览?有这项功能吗? 域的DNS有问题! 出现out of range 只是偶尔出现并不是经常出现?我的配置在里面 想问问大家关于微软认证的看法。 我有光驱上哪找 请问斑竹:c#中有类似exit(0)之类的函数吗, 请问谁有将可执行文件中的资源提取出来保存在新的rc文件中的源代码? PB数据库的连接分类解决问题? 数据窗口鼠标焦点为什么会遗失? 怎么用xp安装盘升级两千或酒吧下的wmp? 怎样得知ListBox中已经有多少项内容了? 看看大家关于微软认证的看法(只能给77,全给了) OFFICE XP以及金山词霸的漂亮菜单如何实现的??有源代码可以参考吗?? 谁能说一下"快手"的程序是怎么工作的啊 这个问题我都问了三遍了,还是没人帮忙回答一下? 请根据人类起源的科学知识,说说人是怎么来的(答案最好简略一点) EI核心版是什么意思 bis装 什么意思 科学知识,如题 8.【1】食盐在20℃、100℃时制作成食盐的饱和溶液,则需溶解食盐的质量分别为 【 】克、【 】克.【2】若将100克水在100℃时制成饱和溶液,溶解食盐40克,然后将温度降到20℃,则 ei是什么意思 结构力学里,用力矩分配法计算连续梁绘制弯矩图和剪力图 EI为常数~ 15、“知识即美德”中的“知识”指的是:() (3.00分) A.伦理学的知识 B.科学知识 C.对善的知识 各个传奇(热血、传奇世界、传奇3g)什么联系?有多少版本? 急请力学高手解(结构力学)悬臂刚架在C点作用荷载P,试求D点的挠度.EI=常数,出来加50分 生活中有哪些科学知识,又有什么科学原理 ei+1=0是什么意思? 氢气与氦气的区别?他们的密度分别是多少? 玛瑙是什么 广州化工原料哪里买优惠 3种以上制取氯化钠的化学方程式及类型 芒硝是什么不要长篇大论 人类在建造人工生态系统的探索中还做了哪些努力?这些努力有什么意义? 临床上的BIS是什么意思? 2011年中国人口密度是美国人口密度的多少倍?最好是最新的数据 那里化工原料群? bis是什么/ 水晶是什么物质?有什么性质?与玻璃有什么区别?与石头有什么区别?水晶有什么用途?价值如何? `日本人口密度大还是中国人口密度大? 人类在建造人工生态系统的探索中还做了哪些努力 得一石头,如图,硬度很高,尽管表面光滑,但可以轻易划伤玻璃,直径约为1cm.求鉴定. 什么是摩氏硬度 结构力学求解器内力系数EA怎么设 芒硝晶体是什么? 摩氏是硬度单位吗? 黑洞的密度有多大黑洞的密度究竟有多大?能打个比方说明一下吗?急想知道 20条生物小常识 急大约一个100字 要开学了 急 哪里买化工原料好?推荐一些质量有保证的,价格优惠点的 请问黑洞的密度有多大? 题目里面出现的“缺镁培养液”指的是含镁量很高的培养液还是没有镁的培养液? 摩氏硬度为9的矿石除了刚玉以外还有什么? 黑洞的密度是多大? 遗传多样性就是基因多样性吗,如果不是,二者有什么区别 摩氏硬度8.5等于多少洛氏硬度 结构力学求解器中的单元材料性质如何确定?本人在做毕业设计,打算用结构力学求解器,求竖向荷载作用下的框架内力.则要求输入梁、柱EI和EA等,问题是这个E是等于所采用的水泥的Ec,还是要预 豌豆的高茎基因(D)与矮茎基因(d)所含密码子为什么相同?有什么原因使其表现的性状不同? 化工原料在哪里能买得到 大家看一下这个Bis-Tris HCl ①细胞的结构②显微镜的使用③光合作用④细胞呼吸 买化工原料应注意什么? 结构力学求解器 请将单元性质输入后再计算是什么意思? 芒硝的化学式 GCr15轴承钢热处理后的弹性极限值和冲击韧度是多少? 结构力学求解器提示将单元性质输入再计算是什么意思 大苏打.芒硝的化学式是. 你知道人类在建造人工生态系统的探索中还做了哪些努力?这些努力有什么意义?急 结构力学求解器中怎么设置单元性质? 芒硝,石膏是什么东东啊,化学式是什么啊,急! 人类在建造人工生态系统的探索中还做的努力,这些努力有什么意义? 魔兽世界里·bis·和·AE·这两个名词是什么意思 芒硝的化学式是什么啊,分子量多少啊?还有其他化学式对应的俗称吗尽量多点. 人类在建造人工生态系统中的探索还做了哪些努力?这些努力有什么意义? bis(fluorosulfonyl)imide这是什么意思? 一个很简单的科学知识,上浮物体在水中都受到浮力的作用,可以用什么来测出浮力的大小? 什么是EI BIS的标准的含义这个也是钢材外贸中遇到的问题
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn