1. 程式人生 > >MFC規則動態庫

MFC規則動態庫

生成 相同id 內容 工作區 類庫 height http image 文件

一、概述

  “是MFC的”意味著可以在這種DLL的內部調用MFC類庫中的內容;“是規則的”意味著它不同於MFC擴展DLL,在MFC規則DLL的內部雖然可以調用MFC類庫,但是其與應用程序的接口不能是MFC,而MFC擴展DLL與應用程序的接口可以是MFC,可以從MFC擴展DLL中導出一個MFC類的派生類;規則DLL能夠被所有支持DLL技術的語言所編寫的應用程序調用,當然也包括使用MFC的應用程序。

二、分類

  MFC規則動態庫分為:

    ①作為靜態鏈接的MFC規則DLL

      該DLL可與MFC類庫靜態鏈接,將所調用的MFC類庫的代碼直接生成在.dll文件中,因此該DLL不需要進行模塊狀態的切換;但該DLL中可能存在重復代碼,文件較大

    ②作為動態鏈接的共享MFC規則DLL

      該DLL可以和調用它的可執行程序同時動態鏈接到MFC動態庫和MFC擴展動態庫,當執行程序調用了該DLL後又在其程序內部用資源句柄加載了MFC資源模板時,執行程序總是默認調用程序內部加載的MFC資源而不是該DLL中鏈接到的MFC資源,若該DLL和執行程序內部存在相同ID的資源,會導致資源重復問題使系統不能獲得正確的資源,因此該DLL須進行模塊狀態切換,以確定指向的資源模板

    ①創建作為靜態鏈接的MFC規則DLL:

      1)創建新工程:MFC AppWizard(dll)

        技術分享

        技術分享

        第一部分:選擇DLL的類型:作為靜態鏈接的MFC規則DLL、作為動態鏈接的共享MFC規則DLL、MFC擴展動態庫

        第二部分:是否支持自動化技術,“自動”允許在一個程序中操控另一個程序或組件;是否支持Windows Sockets(網絡通信),允許程序在TCP/IP網絡上進行通信

        第三部分:是否由MFC向導自動在源代碼中添加註釋

      2)創建完成後自動在工作區生成工程,並包含了如下文件結構:

        技術分享

        技術分享

    ②創建作為動態鏈接的共享MFC規則DLL:

      模塊狀態切換的方法:

        方法一:在DLL接口函數中使用:AFX_MANAGE_STATE(AfxGetStaticModuleState());

        在接口函數退出後,恢復為執行程序內部資源句柄加載的資源

        方法二: //狀態變更

          HINSTANCE save_hInstance=AfxGetResourceHandle(); //獲取當前資源模塊句柄

          AfxSetResourceHandle(程序目前要使用的資源模塊句柄); //設置新的資源模塊句柄

                |--操作

          //狀態還原

          AfxSetResourceHandle(save_hInstance); //設置回原資源模塊句柄

                |--再操作,無須退出即恢復為原執行程序加載的資源

        方法三:在執行程序的調用資源模塊句柄的函數中切換:

          //獲取默認的執行程序自己加載的資源模塊句柄

          HINSTANCE exe_hInstance = AfxGetResourceHandle();

          //獲取包含所需資源模塊句柄的共享MFC規則DLL庫

          HINSTANCE dll_hInstance = GetModuleHandle("共享MFC規則DLL.dll");

          AfxSetResourceHandle(dll_hInstance); //切換狀態

                |--操作

          AfxSetResourceHandle(exe_hInstance); //恢復狀態

                |--再操作,即恢復為默認的執行程序自己加載的資源模塊

MFC規則動態庫