📄 我的dll动态链接库学习笔记.htm
字号:
10.5pt;font-family:Tahoma'>.LIB</span><span style='mso-bidi-font-size:10.5pt;
font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;
mso-bidi-font-family:Tahoma'>文件加入到应用程序的工程中,想使用</span><span lang=EN-US
style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>中的函数时,只须说明一下。隐式调用不需要调用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LoadLibrary()</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>和</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>FreeLibrary()</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>。程序员在建立一个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件时,链接程序会自动生成一个与之对应的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LIB</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>导入文件。该文件包含了每一个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>导出函数的符号名和可选的标识号,但是并不含有实际的代码。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LIB</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件作为</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LIB</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件中导出符号相匹配,这些符号或标识号进入到生成的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>EXE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件中。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LIB</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件中也包含了对应的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件名(但不是完全的路径名),链接程序将其存储在</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>EXE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件内部。当应用程序运行过程中需要加载</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件时,</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>Windows</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>根据这些信息发现并加载</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>,然后通过符号名或标识号实现对</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数的动态链接。所有被应用程序调用的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件都会在应用程序</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>EXE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件加载时被加载在到内存中。可执行程序链接到一个包含</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>输出函数信息的输入库文件</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>(.LIB</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>)</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>。操作系统在加载使用可执行程序时加载</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>。可执行程序直接通过函数名调用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的输出函数,调用方法和程序内部其他的函数是一样的。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'><br>
<br>
<br>
2</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:
Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>、动态调用方式:是由编程者用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>API</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数加载和卸载</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>来达到调用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'><br>
<br>
</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;
mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:
Tahoma'>显式的调用:是指在应用程序中用</span><span lang=EN-US style='mso-bidi-font-size:
10.5pt;font-family:Tahoma'>LoadLibrary</span><span style='mso-bidi-font-size:
10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:
Tahoma;mso-bidi-font-family:Tahoma'>或</span><span lang=EN-US
style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>MFC</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>提供的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>AfxLoadLibrary</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>GetProcAddress()</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>FreeLibrary</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>或</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>MFC</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>提供的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>AfxFreeLibrary</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>释放动态连接库。直接调用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>Win32 </span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LoadLibary</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数,并指定</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的路径作为参数。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LoadLibary</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>返回</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>HINSTANCE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>参数,应用程序在调用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>GetProcAddress</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数时使用这一参数。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>GetProcAddress</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数将符号名或标识号转换为</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>内部的地址。程序员可以决定</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件何时加载或不加载,显式链接在运行时决定加载哪个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件。使用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的程序在使用之前必须加载(</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>LoadLibrary</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>)加载</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>从而得到一个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模块的句柄,然后调用</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>GetProcAddress</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数得到输出函数的指针,在退出之前必须卸载</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL(FreeLibrary)</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'><br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -