⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32环境下dll编程原理.htm

📁 我在网上收集的一些有关vcDLL编程的文章。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  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'>&nbsp;<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'>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'>&nbsp;<br>
  <br>
  &nbsp;&nbsp;</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'>&nbsp;<br>
  &nbsp;&nbsp;</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'>&nbsp;<br>
  &nbsp;&nbsp;</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'>VB</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&nbsp;</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'>&nbsp;<br>
  extern&nbsp;&quot;C&quot;&nbsp;__declspec(dllexport)&nbsp;double&nbsp;SquareRoot(double&nbsp;d);&nbsp;<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'>&nbsp;<br>
  typedef&nbsp;double(SQRTPROC)(double);&nbsp;<br>
  HINSTANCE&nbsp;hInstance;&nbsp;<br>
  SQRTPROC*&nbsp;pFunction;&nbsp;<br>
  VERIFY(hInstance=::LoadLibrary(&quot;c:\\winnt\\system32\\mydll.dll&quot;));&nbsp;<br>
  VERIFY(pFunction=(SQRTPROC*)::GetProcAddress(hInstance,&quot;SquareRoot&quot;));&nbsp;<br>
  double&nbsp;d=(*pFunction)(81.0);//</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'>&nbsp;<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'>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'>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'>&nbsp;<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'>&nbsp;<br>
  <br>
  &nbsp;&nbsp;</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'>Win16</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'>Microsoft</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'>DLL</span><span
  style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -