程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC++動態鏈接庫(DLL)編程深入淺出(四)

VC++動態鏈接庫(DLL)編程深入淺出(四)

編輯:vc教程

  這是《VC++動態鏈接庫(DLL)編程深入淺出》的第四部分,閱讀本文前,請先閱讀前三部分:(一)、(二)、(三)。

  MFC擴展DLL的內涵為MFC的擴展,用戶使用MFC擴展DLL就像使用MFC本身的DLL一樣。除了可以在MFC擴展DLL的內部使用MFC以外,MFC擴展DLL與應用程序的接口部分也可以是MFC。我們一般使用MFC擴展DLL來包含一些MFC的增強功能,譬如擴展MFC的CStatic、CButton等類使之具備更強大的能力。

  使用Visual C++向導生產MFC擴展DLL時,MFC向導會自動增加DLL的入口函數DllMain:

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWord dwReason, LPVOID lpReserved)
{
 // Remove this if you use lpReserved
 UNREFERENCED_PARAMETER(lpReserved);

 if (dwReason == DLL_PROCESS_ATTACH)
 {
  TRACE0("MFCEXPENDDLL.DLL Initializing! ");

  // Extension DLL one-time initialization
  if (!AfxInitExtensionModule(MfcexpenddllDLL, hInstance))
   return 0;

  // Insert this DLL into the resource chain
  // NOTE: If this Extension DLL is being implicitly linked to by
  //  an MFC Regular DLL (such as an ActiveX Control)
  //  instead of an MFC application, then you will want to
  //  remove this line from DllMain and put it in a separate
  //  function exported from this Extension DLL.  The Regular DLL
  //  that uses this Extension DLL should then explicitly call that
  //  function to initialize this Extension DLL.  Otherwise,
  //  the CDynLinkLibrary object will not be attached to the
  //  Regular DLL's resource chain, and serious problems will
  //  result.

  new CDynLinkLibrary(MfcexpenddllDLL);
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  TRACE0("MFCEXPENDDLL.DLL Terminating! ");
  // Terminate the library before destructors are called
  AfxTermExtensionModule(MfcexpenddllDLL);
 }
 return 1;   // ok
}

  上述代碼完成MFC擴展DLL的初始化和終止處理。

  由於MFC擴展DLL導出函數和變量的方式與其它DLL沒有什麼區別,我們不再細致講解。下面直接給出一個MFC擴展DLL的創建及在應用程序中調用它的例子。

6.1 MFC擴展DLL的創建

  下面我們將在MFC擴展DLL中導出一個按鈕類CSXButton(擴展自MFC的CButton類),類CSXButton是一個用以取代 CButton的類,它使你能在同一個按鈕上顯示位圖和文字,而MFC的按鈕僅可顯示二者之一。類CSXbutton的源代碼在Internet上廣泛流傳,有很好的“群眾基礎”,因此用這個類來講解MFC擴展DLL有其特殊的功效。

  MFC中包含一些宏,這些宏在DLL和調用DLL的應用程序中被以不同的方式展開,這使得在DLL和應用程序中,使用統一的一個宏就可以表示出輸出和輸入的不同意思:

// for data
#ifndef AFX_DATA_EXPORT
 #define AFX_DATA_EXPORT __declspec(dllexport)
#endif
#ifndef AFX_DATA_IMPORT
 #define AFX_DATA_IMPORT __declspec(dllimport)
#endif

// for classes
#ifndef AFX_CLASS_EXPORT
 #define AFX_CLASS_EXPORT __declspec(dllexport)
#endif
#ifndef AFX_CLASS_IMPORT
 #define AFX_CLASS_IMPORT __declspec(dllimport)
#endif

// for global APIs
#ifndef AFX_API_EXPORT
 #define AFX_API_

[1] [2] [3] [4] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved