Dynamic call DLL. LoadLibrary and GetProcAddress

Reprinted: https://blog.csdn.net/pjl1119/article/details/18406495

 
  1. 动态引入方式就是使用Windows的两个API即LoadLibrary和GetProcAddress,前者用于获得DLL的句柄,后者用于获得DLL中例程的地址,这种方式之所以被称为动态的,是因为它不需要在程序的开始处把要引入的例程全部列出,只要在调用前引入,并且LoadLibrary可以指定不同的DLL,GetProcAddress可以指定不同的例程,最重要的是如果指定的DLL出错,最多是API调用失败,但不会导致程序终止,因此我们应该在程序中监视DLL的返回值,根据返回值作出相应的处理。如

  2. typedef wstring(* PROCINIT)(int&);

(原型 wstring OutlookInit(int& a);)
 
  1. PROCINIT m_pProcInit;

  2. hinstOutlook = LoadLibrary(TEXT("OLInterface"));

  3. if (hinstOutlook != NULL)

  4. {

  5. m_pProcInit = (PROCINIT) GetProcAddress(hinstOutlook, TEXT("OutlookInit"));

  6. ProcDeInit = (PROCDEINIT) GetProcAddress(hinstOutlook, TEXT("OutlookDeInit"));

  7. ProcMail = (PROCMAIL) GetProcAddress(hinstOutlook, TEXT("OutlookCheckMail"));

  8. ProcAppoint = (PROCAPPOINT) GetProcAddress(hinstOutlook, TEXT("OutlookCheckAppointments"));

  9. }


使用 :
int aa = 100;
 
  1. wstring sTmp = m_pProcInit(aa);

  2.  
  3. 进程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL。如果成功,函数将指定的 DLL 映射到调用进程的地址空间中并返回此 DLL 的句柄,该句柄可与用于显式链接的其他函数(如 GetProcAddress 和 FreeLibrary)一起使用。

  4.  
  5. LoadLibrary

  6.  
  7. LoadLibrary 尝试使用用于隐式链接的同一搜索序列来定位 DLL。如果系统无法找到 DLL 或者入口点函数返回 FALSE,LoadLibrary 将返回 NULL。如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则函数仅返回 DLL 的句柄并递增模块的引用数。

  8.  
  9. 如果 DLL 有入口点函数,则操作系统在调用 LoadLibrary 的进程上下文中调用此函数。如果由于以前调用了 LoadLibrary 但没有相应地调用 FreeLibrary 函数而导致 DLL 已经附加到进程,则不会调用此入口点函数。

  10.  
  11. 加载扩展 DLL 的 MFC 应用程序应使用 AfxLoadLibrary 而不是 LoadLibrary。AfxLoadLibrary 在调用 LoadLibrary 之前处理线程同步。AfxLoadLibrary 的接口(函数原型)与 LoadLibrary 相同。

  12.  
  13. 如果出于某种原因 Windows 无法加载 DLL,进程可以尝试从错误恢复。例如,进程可通知用户所发生的错误,并让用户指定 DLL 的其他路径。

  14.  
  15. 安全说明 如果代码将在 Windows NT 4 或 Windows 2000 上运行,请务必要指定任何 DLL 的完整路径名。

Guess you like

Origin blog.csdn.net/qq_38409301/article/details/90673259