MFC規則動態庫
一、概述
“是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規則動態庫