📄 lion-tut-c17.htm
字号:
和.dll文件。前者是引入库,当其它的程序要调用您的动态链接库中的函数时就需要该引入库,以便把必要的信息加入到其可执行文件中去。<BR>接下来我们来看看如何使用LoadLibrary函数来加载一个DLL。
<P>;---------------------------------------------------------------------------------------------
<BR>;
UseDLL.asm
<BR>;----------------------------------------------------------------------------------------------
<BR><B>.386</B> <BR><B>.model flat,stdcall</B> <BR><B>option casemap:none</B>
<BR><B>include \masm32\include\windows.inc</B> <BR><B>include
\masm32\include\user32.inc</B> <BR><B>include \masm32\include\kernel32.inc</B>
<BR><B>includelib \masm32\lib\kernel32.lib</B> <BR><B>includelib
\masm32\lib\user32.lib</B>
<P><B>.data</B> <BR><B>LibName db "DLLSkeleton.dll",0</B> <BR><B>FunctionName db
"TestHello",0</B> <BR><B>DllNotFound db "Cannot load library",0</B>
<BR><B>AppName db "Load Library",0</B> <BR><B>FunctionNotFound db "TestHello
function not found",0</B>
<P><B>.data?</B> <BR><B>hLib dd
?
; 动态链接库的句柄 (DLL)</B> <BR><B>TestHelloAddr dd
?
; </B>TestHello 函数的地址
<P><B>.code</B> <BR><B>start:</B>
<BR><B> invoke LoadLibrary,addr
LibName</B>
<BR><B>;---------------------------------------------------------------------------------------------------------</B>
<BR><B>; 调用LoadLibrary,其参数是欲加载的动态链接库的名称。如果调用成功,将返回该DLL的句柄。 否则返回NULL。该句柄可以传给
:library函数和其它需要动态链接库句柄的函数。</B>
<BR><B>;-----------------------------------------------------------------------------------------------------------</B>
<BR><B> .if eax==NULL</B>
<BR><B>
invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK</B>
<BR><B> .else</B>
<BR><B>
mov hLib,eax</B>
<BR><B>
invoke GetProcAddress,hLib,addr FunctionName</B>
<BR><B>;-----------------------------------------------------------------------------------------------------------</B>
<BR><B>; 当您得到了动态链接库的句柄后,把它传给GetProcAddress函数,再把您要调用的函数的名称
也传给该函数。如果成功的话,它:会返回想要的函数的地址,失败的话返回NULL。除非卸载该
动态链接库否则函数的地址是不会改变的,所以您可以把它保存到一个:全局变量中以备后用。</B>
<BR><B>;-----------------------------------------------------------------------------------------------------------</B>
<BR><B>
.if eax==NULL</B>
<BR><B>
invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK</B>
<BR><B>
.else</B>
<BR><B>
mov TestHelloAddr,eax</B>
<BR><B>
call [TestHelloAddr]</B>
<BR><B>;-----------------------------------------------------------------------------------------------------------</B>
<BR><B>;
</B>以后您就可以和调用其它函数一样调用该函数了。其中要把包含函数地址信息的变量用方括号括起来。<BR><B>;-----------------------------------------------------------------------------------------------------------</B>
<BR><B>
.endif</B>
<BR><B>
invoke FreeLibrary,hLib</B>
<BR><B>;-----------------------------------------------------------------------------------------------------------</B>
<BR><B>;</B>调用FreeLibrary卸载动态链接库。<BR><B>;-----------------------------------------------------------------------------------------------------------</B>
<BR><B> .endif</B>
<BR><B> invoke ExitProcess,NULL</B>
<BR><B>end start</B>
<P>使用LoadLibrary函数加载动态链接库,可能要自己多做一些工作,但是这种方法确实是提供了许多的灵活性。
<HR SIZE=1>
<DIV align=center> <font face="宋体">
<SCRIPT language=JavaScript1.1 src="../lion-tut-c13.files/textclick"></SCRIPT>
<BR>
</font></DIV>
<font face="宋体"><!-- 10:1 文本广告交换 --> </font>
<DIV align=center> <font face="宋体">
<SCRIPT language=JavaScript1.1 src="../lion-tut-c13.files/c21.htm"></SCRIPT>
<!-- 10:1 文本广告交换 --></font></DIV>
<HR SIZE=1>
<DIV align=center><font face="宋体">翻译:ZhangJun,校对:LuoYunBin's Win32 ASM Page, <A
href="http://asm.yeah.net/">http://asm.yeah.net</A></font></DIV>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -