前腐后继 发表于 2006-12-13 11:14:00

用(VB+汇编)来写简单的程序

<strong><br/><br/></strong>&nbsp;&nbsp;&nbsp;&nbsp;这篇文章是写给初学者的!希望能够对初学者以后的发展有所帮助!(如果你是高手那请你指正指正其中的错误!谢谢)<br/>&nbsp;&nbsp;&nbsp;&nbsp;VB简单易用,开发速度快,其功能也不错,但是有一些功能(例如:远程钩子,因为VB所编写的DLL不是标准DLL,必须要借用其它语言编写出来的标准DLL)如果只是单单用VB来开发,是极难实现的,而汇编语言可谓功能最强大(技术过关的话,什么问题都能解决),但是其开发速度慢,一个简单的东西都要写很多代码!如果把这两种语言合起来一齐编程可谓取长补短(用VB专写介面之类的,用汇编专写VB很难实现的或者是速度要求过高的东西),写出来的程序功能要多强有多强!呵呵!而且开发的速度也不会慢(相对于只用汇编来写速度肯定快)!<br/>&nbsp;&nbsp;&nbsp;&nbsp;这里我给大家介绍一个例子,做这个简单例子所使用的东西:VB6+MASM32V8(安装到c:\masm32v8)+记事本。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>第一步:复制以下的代码到记事本里面(另存为文件名:vbdll.asm),这个就是DLL的ASM源程序。<br/>==================================================================================<br/>.386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;让编译器知道我们是使用386的汇编指令<br/>.model&nbsp;flat,stdcall&nbsp;;使用内存平坦模式<br/>option&nbsp;casemap:none&nbsp;;代码里面的变量规则是:大写不等于小写 <p></p><p>include&nbsp;windows.inc&nbsp;;一些包含文件<br/>include&nbsp;user32.inc&nbsp;<br/>include&nbsp;kernel32.inc&nbsp;<br/>includelib&nbsp;user32.lib&nbsp;<br/>includelib&nbsp;kernel32.lib</p><p>.data<br/>quitdllstr&nbsp;db&nbsp;"你退出了DLL",0&nbsp;<br/>titlestr&nbsp;db&nbsp;"vb+asm",0<br/>str1&nbsp;db&nbsp;"消息框一",0<br/>str2&nbsp;db&nbsp;"消息框二",0</p><p>.data?<br/>dll_hInstance&nbsp;dd&nbsp;?&nbsp;</p><p>.code<br/>&nbsp;&nbsp;&nbsp;dllmain&nbsp;proc&nbsp;hInst:DWORD,&nbsp;reason:DWORD,&nbsp;reserved1:DWORD&nbsp;;DLL的主程序<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.if&nbsp;reason==DLL_PROCESS_ATTACH&nbsp;;当DLL加载的时候<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;hInst&nbsp;;用堆栈操作的方式来保存DLL的句柄<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;dll_hInstance<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.elseif&nbsp;reason==DLL_PROCESS_DETACH&nbsp;;这个是当退出DLL的时候<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invoke&nbsp;MessageBox,NULL,addr&nbsp;quitdllstr,addr&nbsp;titlestr,MB_OK&nbsp;;显示一个消息框!告诉你已经退出了DLL<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.endif<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;eax,TRUE&nbsp;;这句是返回TRUE给EAX寄存器,让系统知道无论发生什么错误都加载DLL<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br/>&nbsp;&nbsp;&nbsp;dllmain&nbsp;endp</p><p>&nbsp;&nbsp;&nbsp;msgbox1&nbsp;proc&nbsp;;给VB调用的子程序1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invoke&nbsp;MessageBox,NULL,addr&nbsp;str1,addr&nbsp;titlestr,MB_OK&nbsp;;invoke是调用的意思!这不是汇编指令!只是伪指令!由编译器执行<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br/>&nbsp;&nbsp;&nbsp;msgbox1&nbsp;endp</p><p>&nbsp;&nbsp;&nbsp;msgbox2&nbsp;proc&nbsp;;给VB调用的子程序2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invoke&nbsp;MessageBox,NULL,addr&nbsp;str2,addr&nbsp;titlestr,MB_OK<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br/>&nbsp;&nbsp;&nbsp;msgbox2&nbsp;endp</p><p>&nbsp;&nbsp;&nbsp;end&nbsp;dllmain&nbsp;;这里是说明dllmain是DLL的主程序(可以这么理解)<br/>==================================================================================</p><p><br/>第二步:建立一个文件名为:vbdll.def的文件,其内容为:<br/>==================================================================================<br/>LIBRARY&nbsp;&nbsp;&nbsp;vbdll<br/>EXPORTS&nbsp;&nbsp;&nbsp;msgbox1<br/>EXPORTS&nbsp;&nbsp;&nbsp;msgbox2<br/>==================================================================================<br/>这个文件只要用于说明DLL里面哪些子程序或函数可以被调用,也就是说哪些子程序或函数被定义为公共的(PUBLIC)<br/>第一个关键字LIBRARY是说明DLL的名称,第二个关键字:EXPORTS是。。。(不用我说都知道了!~呵呵)</p><p><br/>第三步:建立一个批处理文件,文件名为:makedll.bat,这个是用于编译DLL用的,其内容为:<br/>==================================================================================<br/>set&nbsp;include=c:\Masm32v8\include<br/>set&nbsp;lib=c:\Masm32v8\lib<br/>set&nbsp;path=c:\Masm32v8\Bin</p><p>ml&nbsp;-c&nbsp;-coff&nbsp;vbdll.asm<br/>link&nbsp;/dll&nbsp;/SUBSYSTEM:WINDOWS&nbsp;/def:vbdll.def&nbsp;vbdll.obj<br/>==================================================================================</p><p><br/>第四步:这步很简单,呵呵!大家都会做!用VB6新建一个标准的EXE,添加两个按钮(button)和一个模块,代码如下:<br/>==================================================================================<br/>'这是窗口代码<br/>Private&nbsp;Sub&nbsp;Command1_Click()<br/>msgbox1<br/>End&nbsp;Sub</p><p>Private&nbsp;Sub&nbsp;Command2_Click()<br/>msgbox2<br/>End&nbsp;Sub<br/>==================================================================================<br/>'这是模块代码<br/>Public&nbsp;Declare&nbsp;Function&nbsp;msgbox1&nbsp;Lib&nbsp;"vbdll"&nbsp;()<br/>Public&nbsp;Declare&nbsp;Function&nbsp;msgbox2&nbsp;Lib&nbsp;"vbdll"&nbsp;()<br/>==================================================================================</p><p><br/>一切都搞掂了!~运行makedll.bat,如果没有错的话就会生成四个文件:vbdll.dll,vbdll.lib,vbdll.exp,vbdll.obj。将vbdll.dll文件复制到刚才建立</p><p>的VB源程序的目录(或者复制到系统目录也行),将VB源程序生成EXE文件,运行刚生成的EXE文件,按一下按钮,如果有消息框弹出的话那么VB+win32asm编程成功。YES。。。爽</p><p>例子代码:<a href="http://www.cc-365.com/lzq/vb+asm.rar" target="_blank"><font color="#9c0000">http://www.cc-365.com/lzq/vb+asm.rar</font></a></p><p>作者:懒虫<br/>QQ:270909303<br/>mail:lzq@cc-365.com</p>
页: [1]
查看完整版本: 用(VB+汇编)来写简单的程序