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 编辑 ]