• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用DLL為應用程序預留待擴展功能接口

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    動態鏈接函數庫(Dynamic Link Library 簡稱DLL)是組成 Windows 系統的重要元素之一。Windows將構成其系統的大部分程序代碼、數據以及經常用到的資源,以動態鏈接函數庫(二進制文件)的形式存貯在磁盤里。本文主要介紹如何在應用程序中預留待擴展功能接口
    動態鏈接函數庫(Dynamic Link Library 簡稱DLL)是組成Windows系統的重要元素之一。Windows將構成其系統的大部分程序代碼、數據以及經常用到的資源,以動態鏈接函數庫(二進制文件)的形式存貯在磁盤里。本文主要介紹如何在應用程序中預留待擴展功能接口,以及利用DLL編寫這類擴展功能代碼的方法。  

    應用實例  
      在開發應用程序的時候考慮到以后可能要添加某些新的功能,為避免修改源程序所帶來的麻煩,我們可以在開發應用程序的過程中先預留一個擴展功能接口,以后需要擴展功能時,只要把擴展功能部分的代碼單獨編譯成DLL即可。下面是一個示例程序,該示例程序分為應用程序和擴展功能兩部分,當應用程序收到WM_CREATE消息時,檢查是否有擴展功能,若有則裝入;否則返回。該程序在Windows 95下,用Borland c++ 4.5調試通過。  

      /*------PRAC.C 應用程序部分------*/  

      #include <windows.h>  

      #include "prac.h"  

      int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int);  

      long FAR PASCAL MainWndProc(HWND, WORD, WORD, LONG);  

      void MsgFilter(HWND , WPARAM );  

      FARPROC LpExtProc ;  

      /*------- WinMain() -------*/  

      int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,  

                 LPSTR lpszCmdLine, int nCmdShow)  

      {  

       MSG   msg;  

       HWND   hWnd;  

       WNDCLASS wndclass;  

       if ( ! hPrevInstance )  

         {  

          wndclass.style = CS_HREDRAW | CS_VREDRAW;  

          wndclass.lpfnWndProc = MainWndProc;  

          wndclass.cbClsExtra = 0;  

          wndclass.cbWndExtra = 0;  

          wndclass.hInstance = hInstance;  

          wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);  

          wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);  

          wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);  

          wndclass.lpszMenuName = "OurOwnMenu"; //裝入應用程序菜單  

          wndclass.lpszClassName = "Application";  

          if ( ! RegisterClass (&wndclass) )  

           return FALSE;  

         }  

       hWnd = CreateWindow ( "Extend Function" ,  

                  "應用程序示例",  

                  WS_OVERLAPPEDWINDOW,  

                  CW_USEDEFAULT,  

                  CW_USEDEFAULT,  

                  CW_USEDEFAULT,  

                  CW_USEDEFAULT,  

                  NULL,  

                  NULL,  

                  hInstance,  

                  NULL);  

       If (!hWnd )  

         return FALSE;  

       ShowWindow (hWnd, nCmdShow);  

       UpdateWindow (hWnd);  

       while ( GetMessage (&msg, NULL, 0, 0) )  

         {  

          TranslateMessage (&msg);  

          DispatchMessage (&msg);  

         }  

       return msg.wParam;  

      }  

      /*---------- 主窗口函數 WndProc()-------------*/  

      long FAR PASCAL MainWndProc(HWND hWnd, WORD message,  

                        WORD wParam, LONG lParam)  

      {  

       static HANDLE hLibrary;  

       char szBuf[80];  

       switch(message)  

       {  

         case WM_CREATE:  

         /*讀應用程序的初始化文件prac.ini,檢查是否有擴展功能的動態鏈接庫,若沒有則返回;若有則裝入該動態鏈接函接數庫,并取得接口函數的地址,對接口函數進行初始化*/  

           GetPrivateProfileString("MyApp" , "AddMyapp" , "" ,  

                     szBuf,sizeof(szBuf) , "prac.ini");  

           if (szBuf[0] != '\0')  

           if ((hLibrary = LoadLibrary(szBuf)) >= 32)  

            {  

             LpExtProc=(FARPROC)GetProcAddress(hLibrary,  

                      MAKEINTRESOURCE(2));  

             LpExtProc(hWnd , EXTPROC_LOAD);  

            }  

           else  

            MessageBox(hWnd,"Load library failed!","Error",MB_OK);  

           break;  

         case WM_COMMAND:  

           /*函數MsgFilter( )用來過濾菜單消息*/  

           MsgFilter(hWnd , wParam);  

           switch (wParam)  

           {  

             case IDM_COMMAND1: //處理應用程序  

             case IDM_COMMAND2: //定義的菜單功  

             case IDM_COMMAND3: //能,此處省略。  

           }  

           return 0;  

         case WM_DESTROY:  

           if(hLibrary != NULL)  

           FreeLibrary(hLibrary);  

           PostQuitMessage(0);  

           break;  

       }  

       return DefWindowProc(hWnd, message, wParam, lParam);  

      }  

    /*下面過濾函數,把菜單消息的來源分成兩類,即應用程序本身的菜單消息和來自功能擴展部分的菜單消息。應用程序把值在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中加入:

     ?。跘ddApp]

      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

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>