| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1914 人关注过本帖, 1 人收藏
标题:vb 制作 dll 文件心得
只看楼主 加入收藏
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
结帖率:100%
收藏(1)
 问题点数:0 回复次数:9 
vb 制作 dll 文件心得
  vb仅提供作为工程引用的类的dll文件制作,很方便好用。调试时只要将类和窗体放在同一工程里,假如类名称为abcd,在窗体里使用该类只需要dim a as new abce即可,以后即可用“a.类方法”的方式使用类,当调试完成,类abcd的所有属性、方法均能正常使用后,可移除窗体,在“工程--属性--工程类型”里选择“activex dll”,编译后即得到一个dll文件,以后要使用是必须先注册该dll,再在工程里引用,最后就可以像其他类一样定义类实体了。
  用这种方式制作的dll文件优点是和vb的契合性强,所有使用vb的方法都可以在这里使用,可靠性很高,缺点是需要注册,如果总在修改,有时自己都注册混乱了,如果只完成很小的功能也注册一下,会让注册表庞大,系统变慢。
  其实,vb也可以制作函数输出的dll。vb编译时也和c的编译过程一样,需要link程序连接多个中间代码目标文件(obj文件),但vb的这个过程是隐含的,因此需要拦截link命令,对其中间加入“/EXPORT 函数名”的开关,再将该修改后的命令提交给原link程序链接编译即可。我写了个无窗口的拦截link命令并自动修改添加输出函数的程序,源代码为:
制作输出函数DLL.rar (5.79 KB)
。使用方法是:先将vb6的原link.exe文件改名为link2.exe,再将压缩包里的link.exe文件拷贝到vb6的目录里即可。以后如果不是编译dll文件将看不出有什么不同,如果是编译dll文件将会自动发现可输出的函数,并自动修改编译命令,编译成功后还自动提示编译了多少个输出函数以及函数名。
  使用可输出函数的dll最大的好处就是无需注册,无需引用,在vb里只要把dll文件放在工程目录,像使用api一样声明一下即可。缺点是要有c语言的一点知识,尤其是参数传递要小心,否则很容易出错退出(程序崩溃),在此次编写加解密dll过程中,有些心得,现纪要如下供参考:
1,可作为输出的函数只能在模块里编写的public function,如果在类里则程序会崩溃。
2,vb给dll函数传送byval字符串时,dll接受到的是一个地址指针,该指针指向的字符串已经转换为lpstr格式存储,字符串是以\0结尾,字符串以asc码格式存储.vb是以bstr格式存储字符串,该格式头两个字节定义字符串长度,字符串以unicode码格式存储。
3,dll返回字符串时会自动转换为unicode格式,因此dll函数返回字符串前要strconv(字符串,vbFromUnicode)去unicode.
4,dll里应用指针,我是用ReadProcessMemory函数读取内存的,该方法需要进程pid,在dll里获取pid是比较麻烦的,因为pid一般是通过窗口句柄获取的,如果是无窗口的进程又应该怎样获取pid呢?我用了一个很狗血的方法获取pid,大致思路:pid不过是一个long型数据,通过一个循环就可以找到调用dll的进程的pid.虽然效率低,但可以完成要求,现在想想,用copymemory可能更方便些。
5,vb字符串在内存里其实不完全是unicode格式,实际上英文是unicode,而中文则是汉字内码,从外在应用来说没有区别。
6,vb编写的输出函数dll居然不能使用全局或全程数组变量,很纳闷。


[ 本帖最后由 lowxiong 于 2014-6-6 22:31 编辑 ]
搜索更多相关主题的帖子: 可靠性 制作 工程 
2014-06-06 22:10
wtywtykk
Rank: 1
等 级:新手上路
帖 子:5
专家分:4
注 册:2014-6-7
收藏
得分:0 
回复 楼主 lowxiong
readprocessmenory需要pid?只是要句柄吧。pid和当前进程句柄都好得,用getcurrentprocess得到句柄,不用释放,pid用getcurrentprocessid。其实当前进程句柄恒为-1,当前线程-2。writeprocessmenory速度比copymemory慢,但好处是不用考虑写保护

[ 本帖最后由 wtywtykk 于 2014-6-7 12:48 编辑 ]
2014-06-07 12:47
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:0 
回复 2 楼 wtywtykk
谢谢,进程句柄是从pid中用openprocesse获得的。最初我也是用getcurrentprocesse获取当前进程句柄,后来考虑到当前进程不一定是调用我dll的进程,所以废弃了。后来仔细想想,不能用copymemory,因为该函数需要事先知道字串长度,lpstr格式指针只有先扫描内存才能获取字串长度,我有扫描的功夫就已经可以得到字串内容了。

[ 本帖最后由 lowxiong 于 2014-6-7 14:40 编辑 ]
2014-06-07 14:36
fddfaf
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-6-7
收藏
得分:0 
学习了
2014-06-07 16:25
phx0502066
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-6-7
收藏
得分:0 
好东西,拿下来学习。
2014-06-07 16:57
wtywtykk
Rank: 1
等 级:新手上路
帖 子:5
专家分:4
注 册:2014-6-7
收藏
得分:0 
回复 3 楼 lowxiong
没搞懂,调dll的一定是当前进程啊,还会是什么?另外lstrcpy可以直接复制字符串,但要提供足够的缓冲区。微软还给了些安全字串函数,没怎么用过
2014-06-08 12:08
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:0 
回复 6 楼 wtywtykk
系统里同时运行的进程有n个,当前进程只有一个,凭什么只有当前进程调dll,其他进程就休眠了?你可以写个简单的程序验证下就明白了。我认为系统设置个当前进程只是要明白键或鼠标消息应该谁接受而已。lpstrcpy也需要定义接受变量的长度,配合lpstrlen函数也只在vb里使用,在制作输出的dll函数里无法得到正确的字符串长度,我也是反复实验才决定放弃的。
2014-06-08 13:58
hfq20052006
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-7-29
收藏
得分:0 
好东东,下来学习下!
2014-07-29 18:04
chuyunfei33
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-6-3
收藏
得分:0 
好东西,学习了~~~~~~~~~~~~~~~~~~~~~~~~~
2014-09-05 17:20
jyzas
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2012-7-13
收藏
得分:0 
终于找到答案了,谢谢楼主分享
2022-03-10 21:36
快速回复:vb 制作 dll 文件心得
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050816 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved