posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

load dll 简单方式 (收集)

Posted on 2011-08-10 07:04 RTY 阅读(543) 评论(0)  编辑 收藏 引用 所属分类: C/C++
http://blog.csdn.net/aca_jingru/article/details/2524697

  1. 本文转自codeprojcet  <a href="http://www.codeproject.com/kb/dll/dllease.aspx">http://www.codeproject.com/KB/DLL/dllease.aspx</a>   

load dll也就是load dll中的函数,一般是loadlibrary,GetProcAddress,每一步都要判断函数返回是否正确,比较繁琐,

该作者干脆做了个封装,将这些重复步骤封装到一个bool的函数中,这样只要在if语句中调用一下可以了,具体来看代码:这里用到了c语言的可变参数,对此俺也不是很了解

 

  1. //GetProcAddresses  
  2. //Argument1: hLibrary - Handle for the Library Loaded  
  3. //Argument2: lpszLibrary - Library to Load  
  4. //Argument3: nCount - Number of functions to load  
  5. //[Arguments Format]  
  6. //Argument4: Function Address - Function address we want to store  
  7. //Argument5: Function Name -  Name of the function we want  
  8. //[Repeat Format]  
  9. //  
  10. //Returns: FALSE if failure  
  11. //Returns: TRUE if successful  
  12. BOOL GetProcAddresses( HINSTANCE *hLibrary,   
  13.     LPCSTR lpszLibrary, INT nCount, ... )  
  14. {  
  15.     va_list va;  
  16.     va_start( va, nCount );  
  17.   
  18.     if ( ( *hLibrary = LoadLibrary( lpszLibrary ) )   
  19.         != NULL )  
  20.     {  
  21.         FARPROC * lpfProcFunction = NULL;  
  22.         LPSTR lpszFuncName = NULL;  
  23.         INT nIdxCount = 0;  
  24.         while ( nIdxCount < nCount )  
  25.         {  
  26.             lpfProcFunction = va_arg( va, FARPROC* );  
  27.             lpszFuncName = va_arg( va, LPSTR );  
  28.             if ( ( *lpfProcFunction =   
  29.                 GetProcAddress( *hLibrary,   
  30.                     lpszFuncName ) ) == NULL )  
  31.             {  
  32.                 lpfProcFunction = NULL;  
  33.                 return FALSE;  
  34.             }  
  35.             nIdxCount++;  
  36.         }  
  37.     }  
  38.     else  
  39.     {  
  40.         va_end( va );  
  41.         return FALSE;  
  42.     }  
  43.     va_end( va );  
  44.     return TRUE;  
  45. }  
  1. 使用的例子:  
  1. <pre class="csharp" name="code"><pre class="csharp" name="code">#include <windows.h></windows.h>  
  2.   
  3. typedef int ( WINAPI *MESSAGEBOX )   
  4.     ( HWND , LPCSTR, LPCSTR, DWORD );  
  5. typedef int ( WINAPI *MESSAGEBOXEX )   
  6.     ( HWND , LPCSTR, LPCSTR, DWORD , WORD );  
  7.   
  8. void main(void)  
  9. {  
  10.     MESSAGEBOX lpfMsgBox = NULL;  
  11.     MESSAGEBOXEX lpfMsgBoxEx = NULL;  
  12.     HINSTANCE hLib;  
  13.     if(GetProcAddresses( &hLib, "User32.dll", 2,  
  14.         &lpfMsgBox, "MessageBoxA",  
  15.         &lpfMsgBoxEx, "MessageBoxExA" ) )  
  16.     {  
  17.         lpfMsgBox( 0, "Test1""Test1", MB_OK );  
  18.         lpfMsgBoxEx( 0, "Test2""Test2", MB_OK,   
  19.             MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ) );  
  20.     }  
  21.     if ( hLib != NULL )  
  22.         FreeLibrary( hLib );  
  23. }  
  1. 是不是很好用呢 囧  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理