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

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

编辑:说三道四文库 发布时间:2017-01-19 06:57
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里
}
搞定,谢谢!
大数据领域,实时打击欺诈犯罪的4个战场 一周消息树:谷歌Project Ara,将开启下一个智能手机时代 数据恢复服务商的6个最佳实践 【走近讲师】谭晓生:魔高一尺道高一丈,360基于大数据的网络攻击检测 一周热点:摩尔定律让位于贝索斯定律 阿里巴巴集团CTO王坚确认出席第六届中国云计算大会 【走近讲师】青云甘泉:混合云的构建及其对企业的帮助 RadiumOne创始人兼CEO因家暴被公司解雇 3D打印狂潮:可检测皮肤疾病的低价手机显微镜 浅谈导航设计,开发者必备的十大实用技巧 【云先锋 41】上海越诚:基于云服务的建站类iService软件超市 董西成:Hadoop将在高速发展和完善中扩大优势! 【走近讲师】 华云数据郁珉:公有云市场八仙过海 价格不是唯一标准! Facebook、Twitter、Google移动广告之争 开发者的黄金时代=运维人员的恶梦? 研发团队平稳度过“从小到大”并非易事 诺基亚品牌手机不久将消失 Stephen Elop回应不是木马 看七家科技公司Logo的最初模样 移动UI框架Fries:私人定制最Sexy的用户界面 必须Mark!最佳HTML5应用开发工具推荐 百度技术开放日感悟:看百度如何获取大数据时代的“船票” 谷歌亚马逊微软的烧钱游戏 拉手网CTO官冲:团购网在大数据应用上的探索 究竟谁真正关心比特币,不妨看看基于大数据的百万条推特分析 Firefox 29正式版:高度自定义模式、全新菜单和Australis UI 冼茂源:HBase在垂直搜索业务以及数据存储中的应用! 阿里云计算北京布点 全球第三个云数据中心开放 【走近讲师】友友天宇CEO姚宏宇:与行业结合是私有云厂商的重要出路 万亿移动支付产业的难点和痛点 削减硬件运营成本?亚马逊或自主研发ARM架构芯片 开源框架eMobc:XML开发原生移动应用so easy 各位大虾 谁能提供视频采集卡的原代码,必须要CB的,300分 在堆(heap)上与在栈(stack)上建立的对象有什么区别? 一个问题,在做元件时怎样建立TdateTimePicker 给大家看看我弟弟给我的信 求助,标题栏为“The police are investigating the robbery-"的是什么程序? 谁能将.CPP文件的代码翻译成DELPHI语言?? 有关于FLASH5.0的问题!!!请各位大吓指点! 一个问题,怎样在PC:PageControl上增加TabSheet1,TabSheet1,TabSheet1…. 标题栏为“The police are investigating the robbery-"的是什么程序? 一个弱弱的问题 一个问题,建立的 FB: TBevel没显示,好象根本没建立一样。 如何在 MDI CLIENT 中添加快捷方式??谢谢!! 55分,如何映射控件中子控件的消息? 如何选择书 关于文献数据库的一个问题-如何把一个字段和一个文件关联起来? 所有喜欢到水园来逛逛,但是从不回帖子或很少回帖子的人进来签到~~~~ 谁来救救我呀,我好惨呀。。。。 如何通过VC编程,随时关闭网络端口 诚寻对嵌入式linux感兴趣的网友 今天临走前,再灌一桶酒! 急!!!哪里可以下载到制作工具栏时用到的位图呀? 太原的在哪能买到程序员杂志 我的qq:10120129 谁找我??? xml 高手帮帮我,为什么我下面的文件,在IE5.0中什么也没有?? 请问高手:在uml类图中如何用关系表示一个实体类和一个接口间的关系。 Cathy进来~~ 请问高手们一个Delphi的一个应该是比较底层的东西。 mimi大酒店正式開業﹗先進來的有分啊﹗ 哪个高手完整地讲讲OpenWith菜单项的调用方法和函数等 关于非模态对话框中使用UpdateData(FALSE)函数的问题,朋友,帮个忙好吗? “记事本”小问题,大逻辑.大虾们,照顾照顾小弟呗. Linux下配置ISDN--期待所有的Linux高手到来?? 我是女生,哈哈 急,怎么样在打印表格时使较长的字段分两行显示,并字体变小。 在VB里做的用户控件为什么在VC不能调用啊! 不服不行(真没辙了)[不够可在加200分] 我的代理怎么了? 寻找能显示CAD图纸的delphi控件 偶要给lastlove(☆☆☆☆☆robin★★★★★)放高利贷了! 哪位做过读取网卡地址的动态链接库? c++builder与sql server 2000的sql语言兼容性问题 为什么TWaitThread的帮助在help里找不到? 有关WIN2K策略的设置? TREEVIEW中如何打印结构树? 急急急!opensheet(w_child,w_main,2,Original!)不好使了?为啥? 100分求教,存储过程的两个问题! 哪位大侠有MPEG数据帧格式的资料,望告之,谢了。 大家出个主意,怎么使这个查询速度最快??? 还有人么?再问个问题:) MM_mimi我走了~~~~~~~~~我好失望~~~~ 如图,已知正方形ABCD边长为1cm,点E在对角线BD上,BE=BC,P是CE上一动点,PF⊥BD,PG⊥BC,PF+PG的值为 解不等式组x-3(x-2)大于等于4 5分之2x-1小于2分之x-1 求未知数x 五分之四x=二分之一 x:3.2=4 七分之x=五分之二 x分之六=九分之八 这是怎么解出来v的 我写出来的始终是分数形式 i e或者l都约不了 解不等式 (3分之x-2)-(2分之3x+5)大于等于x-(3分之2-x) 阴影部分面积是150平方厘米,求图中未知数b.(提示:60°:360°=六分之一) 数学第15,16题. 数学大神求救格式与方法 3-x分之1+3x小于等于2解不等式 16题, (1-3分之1)乘(1-4分之1)乘(1-5分之1)乘……乘(1-2009分之1)乘2009找规律,巧计算,求算式 同问 不等式组5大于2(1-x)和-三分之一x小于等于三分之二-x的整数解的和是 第15,16题 1/1乘3+1/3乘5+1/5乘7+.1/2007乘2009 求不等式组x小于3(x+1) (2-x/3)+1大于等于x 的整数解 16题 24分之3乘以20等于多少 不等式组9x-a大于等于0 8x-b小于等于o X的整数解是1,2,3.适合的整数a,b的有序数对是(a,b) A17个 B64个 C72个 D81个 数学习题,必好评,15,16 816乘以3约等于多少 解不等式:x+1分之x-3小于或等于3 第15,16两题, 22度16分乘以5等于多少 X和0.8的比等于6分之5和2的比,求X 15、16两题 几乘以几等于28 5和8的比等于40和x的比. 15和16两题 5/6乘以20/15再加上106/100等于几 当x=5时,代数式4x-8/3的值是4,当x=多少时,代数式4x-8/3的值是-1/3 15和16两题谢谢 已知7分之1等于0.142857循环,问:最少从小数点后面第几位开始,到第几位上的数字之和等于2000? 第一个 :当x取何值时,代数式【(5x-2)/8】-x的值比代数式【(x+11)/2】-3的值小1?第二个 :某同学在解方程3a-x=13时,误将-x看做+x,解得x=—2,则原方程的解是多少?第三个 :x=2是关于x的方程7+2 求15,16两题, 已知7分之1=0.142857循环,问:最小从小数点后第几位开始,到第几位上的数字和等于2000 当x为什么数时,代数式0.1x-2/0.2的值比代数式-1/6x+2/3的值大3? 考研数学课本重要还是习题册重要 已知七分之一等于0.142857,问小数点后面第100位上的数字是几?小数点后面前100位上的数学之和是多少 x为何值时代数式5/6x-1与代数式4+5/1x的值相等一元一次方程求求你们了(解题过程) 关于2009年数学一考研真题第17题求助,数一17题第二问说求体积,那个就是用锥体的体积减去椭球体的一部分,这部分的求法很多,我是想用二重积分曲顶柱体的体积算法,即把x解出来,然后做积分, 已知7分之1=0.142857,142857的循环.问小数点后面第100位上的数字是几?小数点后面前100位上的数字之和是多少? x取什么值时,代数式2x-5大于代数式1/2(2-x)? 如图,第一步,和第二步的依据是什么啊?好像没有相应的定理吧? 已知七分之一=0.142857(循环结0.142857的循环),问小数点后面第100位上的数字是几?小数点后面前100位上的数字之和是多少? 代数式5分之X+3的值是否能同时大于代数式2X+3和1-X的值?说明理由 10----16题怎么写? 0.3循环什三分之一吗?那0.3循环乘以3是1还是0.9循环? x取什么值时,代数式2x-5的值(1)不大于0(2)不小于-1(3)小于2分之1x+3(4)小于3分之2x-8说明理由 判断题:1.如果甲数的三分之二大于乙数的四分之三(甲乙都不等于0),那么甲数小于乙数.(为什么错?)2.体积相等的两个长方体,他们的表面一定相等.为什么错?1.a是一个大于0,而不大于1的数, 6.8小时等于几小时几分? 当x等于多少时,代数式三分之二x与代数式负二分之一x减二的和为0 ..数学14、15、16题求讲解 4.8小时等于几小时几分? 二分之一X:四分之一=8 求未知数,根本就没教过七分之五=二分之一:X 一次数学小测验中,有一道这样的填空题:0.3= ————%.小丽在横线上填了30%,而老师却判小丽填错了,小丽不服,去找老师问个究竟.请聪明的你评评小丽答对了吗,为什么? 7+8等于几 求未知数X 4.X-2/7X=1/14 这题怎么写、、求数学大神 四个9怎么加等于1万 7x+8(x-2)[x是未知数]如何化简?如:15x+4x=19x[x是未知数]
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn