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

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

📁 我在网上收集的一些有关vcDLL编程的文章。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  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'>MFC&nbsp;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'>&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'>DllMain</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;DllMain</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'>DLLMain</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'>DLLMain</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'>DLLMain</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>
  HINSTANCE&nbsp;g_hInstance;&nbsp;<br>
  extern&nbsp;&quot;C&quot;&nbsp;int&nbsp;APIENTRY&nbsp;DllMain(HINSTANCE&nbsp;hInstance,DWORD&nbsp;dwReason,LPVOID&nbsp;lpReserved)&nbsp;<br>
  {&nbsp;<br>
  if(dwReason==DLL_PROCESS_ATTACH)&nbsp;<br>
  {&nbsp;<br>
  TRACE0(&quot;EX22A.DLL&nbsp;Initializing!\n&quot;);&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>
  }&nbsp;<br>
  else&nbsp;if(dwReason=DLL_PROCESS_DETACH)&nbsp;<br>
  {&nbsp;<br>
  TRACE0(&quot;EX22A.DLL&nbsp;Terminating!\n&quot;);&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>
  }&nbsp;<br>
  return&nbsp;1;//</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;<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'>DLLMain</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'>DLLMain</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'>DLLMain</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'>dwReason</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'>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'>32</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'>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'>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'>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'>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'>HMODULE</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'>0x400000</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'>0x10000000</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'>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'>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>
  </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'>FindResource</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'>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;

⌨️ 快捷键说明

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