精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>动态连接库(.dll, .so)>>用DLL为应用程序预留待扩展功能接口(2)

主题:用DLL为应用程序预留待扩展功能接口(2)
发信人: mark7312(小马哥)
整理人: wenbobo(2002-12-24 09:08:38), 站内信件
/*下面过滤函数,把菜单消息的来源分成两类,即应用程序本身的菜单消息和来自功能扩展部分的菜单消息。应用程序把值在MIN_FMT至MAX_FMT之间的菜单消息留给待扩展程序使用。如果有来自扩展程序的消息,就通过接口函数LpExtProc()把该消息传送给扩展程序,由扩展程序负责处理该消息*/ 

  void MsgFilter(HWND hWnd , WPARAM wParam) 

  { 

   if((wParam >= MIN_FMT)&&(wParam <= MAX_FMT))

    LpExtProc(hWnd , wParam);

   return;

  }

  /*---------------- End of PRAC.C-----------------*/

  /*----------- PRAC.H ----------*/

  #define MIN_FMT       100

  #define MAX_FMT      199

  #define EXTPROC_LOAD   200

  #define IDM_COMMAND1   201

  #define IDM_COMMAND2   202

  #define IDM_COMMAND3   203

  /*---End of PRAC.H ---*/

  ; 应用程序的模块定义文件PRAC.DEF

  NAME     PRAC

  DESCRIPTION  'demonstrate a different system menu'

  EXETYPE    WINDOWS

  STUB      'WINSTUB.EXE'

  CODE      PRELOAD MOVEABLE DISCARDABLE

  DATA     PRELOAD MOVEABLE MULTIPLE

  HEAPSIZE   1024

  STACKSIZE   8192

  EXPORTS    MainWndProc

  ; End of PRAC.DEF

  /*---资源定义文件PRAC.RC---*/

  #include "prac.h"

  OurOwnMenu MENU

  BEGIN

   MENUITEM "Command&1",   IDM_COMMAND1

   MENUITEM "Command&2",   IDM_COMMAND2

   MENUITEM "Command&3",   IDM_COMMAND3

  END

  /*---End of PRAC.RC---*/

  若要扩展上面应用程序的功能,在不改动上述程序的情况下,只需将功能扩展部分的代码编写成动态链接函数库,编译成.DLL文件,并在PRAC.INI文件中加入下面语句,即可达到扩展功能的目的。在PRAC.INI中加入:

  [AddApp]

  AddMyapp=c:\win95\system\extproc.dll

  扩展功能的动态链接函数库代码如下:

  /*-----EXTPROC_DLL.c-----*/

  #include <windows.h> 

  #include <commdlg.h> 

  #include "extproc_dll.h" 

  HMENU hMenu , hExtMenu; 

  HWND hWndExt = NULL; 

  int FAR PASCAL LibMain(HANDLE hModule , WORD wDataSeg, 

              WORD HeapSize , LPSTR lpszCmdLine) 

  { 

   if(HeapSize != 0) 

    UnlockData(0); 

   return 1; 

  } 

  int FAR PASCAL WEP(int SystemExit) 

  { 

   switch (SystemExit) 

    { 

     case WEP_SYSTEM_EXIT: 

                 return 1; 

     case WEP_FREE_DLL: 

                 return 1; 

     default: 

         return 1; 

    } 

  } 

  /*函数FMExtensionProc()即为扩展功能的处理函数,当过滤函数检索到有来自扩展功能的菜单消息时,就调用该函数进行处理。在此仅以设置打印机、选择字体来说明扩展功能的处理过程,读者可根据自己的需要修改*/ 

  void FAR PASCAL FMExtensionProc(HWND hWndFMExt , WORD wMessage) 

  { 

   PRINTDLG  pd; 

   CHOOSEFONT fnt; 

   LOGFONT lf; 

   CHOOSECOLOR chclr; 

   DWORD dwColor; 

   DWORD dwCustClrs[16]; 

   int i; 

   switch(wMessage) 

     { 

     /*处理FMEVENT_LOAD消息,加载用户扩展功能菜单FMExtMenu*/ 

      case EXTPROC_LOAD: 

         hExtMenu = LoadMenu(FMExtInst,"FMExtMenu"); 

         hMenu = GetMenu(hWndFMExt); 

         AppendMenu(hMenu,MF_POPUP,hExtMenu ,"扩展功能(&E)"); 

         SetMenu(hWndFMExt,hMenu); 

         break; 

     /*下面是用户可自定义的扩展功能代码*/ 

      case IDM_PRINTERSETUP: //设置打印机 

        pd.lStructSize = sizeof(PRINTDLG); 

        pd.hwndOwner = hWndFMExt; 

        pd.hDevMode  = NULL; 

        pd.hDevNames = NULL; 

        pd.Flags = PD_RETURNDC|PD_SELECTION|PD_PRINTSETUP; 

        pd.nCopies   = 1; 

        PrintDlg((LPPRINTDLG)&pd); 

        break; 

      case IDM_SELECTFONT: //选择字体 

        fnt.lStructSize = sizeof(CHOOSEFONT); 

        fnt.hwndOwner = hWndFMExt; 

        fnt.hDC     = NULL; 

        fnt.lpLogFont = &lf; 

        fnt.Flags   = CF_SCREENFONTS|CF_EFFECTS; 

        fnt.rgbColors = RGB(0,255,255); 

        fnt.lCustData = 0L; 

        fnt.nFontType = SCREEN_FONTTYPE; 

        fnt.nSizeMin  = 0; 

        fnt.nSizeMax  = 0; 

        ChooseFont(&fnt); 

        break; 

     } 

   return; 

  } 

  /*------------End of EXTPROC_DLL.C------------*/ 

  /*----- EXTPROC_DLL.H -----*/ 

  #define IDM_PRINTERSETUP 101 

  #define IDM_SELECTFONT  102 

  #define EXTPROC_LOAD   200 

  void FAR PASCAL _export FMExtensionProc(HWND,WORD); 

  /*-----End of EXTPROC_DLL.H -----*/ 

  ;资源文件EXTPROC_dll.RC 

  #include "windows.h" 

  #include "extproc_dll.h" 

  FMExtMenu MENU DISCARDABLE 

  BEGIN 

   MENUITEM "Printer&Setup" ,IDM_PRINTERSETUP 

   MENUITEM "Select&Font"  ,IDM_SELECTFONT 

  END 

  ;End of EXTPROC_DLL.RC 

  ;模块定义文件EXTPROC_DLL.DEF 

  LIBRARY EXTPROC 

  DESCRIPTION 'File Manager Extension DLL' 

  EXETYPE WINDOWS 

  CODE PRELOAD MOVEABLE DISCARDABLE 

  DATA PRELOAD SINGLE SHARED 

  HEAPSIZE 1024 

  EXPORTS 

   WEP @1 RESIDENTNAME 

   FMExtensionProc @2 

  ;End of EXTPROC_DLL.DEF 

本文转载:潘汉杰的文章


----
小马哥

美丽的梦和美丽的诗一样,都是可遇而不可求的,
常常在最没能料到的时候里出现
     

[关闭][返回]