1. 程式人生 > >VS2015動態庫程式設計之MFC規則動態庫(中)

VS2015動態庫程式設計之MFC規則動態庫(中)

文章相關視訊教程下載地址http://pan.baidu.com/s/1mhKxdbU

3 共享連結的MFC規則動態庫

對比靜態連結,共享連結的MFC規則動態庫所佔的體積較小。但是在使用後者中的資源時,需要進行模組切換。

3.1 模組切換

應用程式程序本身及其呼叫的每個DLL模組都具有一個全域性唯一的HINSTANCE控制代碼,這些控制代碼代表了程序模組或DLL模組在虛擬空間中的起始地址。對於呼叫共享連結的MFC規則動態庫的程式,其資源模組控制代碼預設是程序模組控制代碼,即DLL模組的起始地址也預設為程序模組地址,而不是DLL模組本身的起始地址。因此,如果呼叫動態庫的應用程式要使用動態庫中的資源,需要將資源控制代碼指定為

DLL的模組控制代碼。這就是所謂的模組切換。

3.2 建立動態庫

建立共享連結的MFC規則動態庫的方法與建立靜態連結的MFC規則動態庫的方法類似,區別在於圖2中選擇“使用共享MFC DLL的規則DLL”而不是“帶靜態連結MFC的規則DLL”。

2.2 編寫動態庫”中介紹的方法相同,為動態庫新增一個對話方塊和一個匯出函式ShowDialog(),該函式的功能是顯示對話方塊,並將對話方塊的“Caption”設定為“DLL程式的對話方塊”。該動態庫的名稱為MFC_Regular_Share_DLL_Test.dll

此時,雙擊“解決方案資源管理器”中的“Resource.h”標頭檔案,檢視新增的對話方塊資源

ID5000,如圖5所示。

 

5 檢視對話方塊資源ID

3.3建立呼叫動態庫的程式

建立一個基於對話方塊的MFC程式,在該對話方塊中新增一個按鍵,當按下該按鍵後,使用動態的方式載入MFC_Regular_Static_DLL_Test.dll,程式碼如下所示

HINSTANCE hDll;

hDll = LoadLibrary(_T("MFC_Regular_Share_DLL_Test.dll"));

if (hDll == NULL)

{

MessageBox(_T("匯入動態庫失敗"));

return;

}

lpFun pShowDialog = (lpFun)GetProcAddress(hDll, "ShowDialog"

);

if (pShowDialog == NULL)

{

MessageBox(_T("搜尋函式地址失敗"));

return;

}

pShowDialog();

接下來,為該MFC程式新增一個對話方塊資源,將該對話方塊資源的“Caption”設定為“呼叫DLL程式的對話方塊”,以區別DLL中的對話方塊資源。之後,為新新增的對話方塊資源新增相應的類。

雙擊MFC程式的“解決方案資源管理器”中的“Resource.h”標頭檔案,將新新增的對話方塊ID的值修改為在“3.2建立動態庫”中提到的動態庫對話方塊ID的值,即5000,如圖6所示。

 

6 修改對話方塊資源的ID

將MFC_Regular_Static_DLL_Test.dll拷貝到MFC程式原始碼所在的路徑下,之後執行該MFC程式,點選按鍵後彈出的對話方塊並不是DLL中的對話方塊而是MFC程式中的對話方塊,如圖7所示。

 

7 彈出的對話方塊為MFC程式中的對話方塊

產生上述情況的原因即為在3.1模組切換”中提到的,對於呼叫共享連結的MFC規則動態庫的程式,其資源模組控制代碼預設為程序模組地址。因此,此時顯示的是程序模組地址中ID5000的對話方塊資源,而不是DLL模組地址中ID5000的對話方塊資源。

相關推薦

VS2015動態程式設計MFC規則動態

文章相關視訊教程下載地址http://pan.baidu.com/s/1mhKxdbU 3 共享連結的MFC規則動態庫 對比靜態連結,共享連結的MFC規則動態庫所佔的體積較小。但是在使用後者中的資源時

linux 核心模組程式設計編譯多個原始檔

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

Qt網路程式設計QNetworkRequest和QNetworkReply例項

設想有如下場景:輸入若干的url,然後依次的下載並存儲到檔案。本案例使用QNetworkRequest和QNetworkReply。原始碼如下: 案例原始碼 標頭檔案 #pragma once //////////////////////////////////

Android網路程式設計傳遞資料給伺服器

        我曾在《Android網路程式設計之傳遞資料給伺服器(一) 》一文中介紹瞭如何通過GET方式傳遞資料給伺服器,通過GET方式傳遞資料主要適用於資料大小不超過2KB,且對安全性要求不高的情況下。下面就介紹通過POST方式傳遞資料主到伺服器。 一、通過P

java網路程式設計Netty實戰資料通訊

Netty最佳實戰資料通訊 1 分析       我們需要了解下在真正專案應用中如何去考虛Netty的使用,大體上對於一引數設定都是根據伺服器效能決定的。這個不是最主要的。       我們要考慮的問題是兩臺機器(甚至多臺)使用Netty的怎樣進行通訊,我

Android程式設計DialogFragment原始碼詳解

DialogFragment是Fragment家族成員之一,如果你把它簡單的理解成Dialog,那就錯了。它的確可以做作dialog顯示,還可以顯示出自己定義的Dialog或者AlertDialog,但它同時也是一個Fragment。 按照官方的話來理解就是,你既可以把它當

Android平臺藍芽程式設計藍芽聊天分析

接著上一篇沒有完成的任務,我們繼續分析這個藍芽聊天程式的實現,本文主要包括以下兩個部分的內容:其一,分析掃描裝置部分DeviceListActivity,其二,分析具體的聊天過程的完整通訊方案,包括埠監聽、連結配對、訊息傳送和接收等,如果有對上一篇文章不太熟悉的,可以返回

Qt網路程式設計QTCPSocket和QTCPServer例項

設想有如下場景:若干的客戶端與伺服器端建立連線,建立連線後,伺服器端隨機發送字串給客戶端,客戶端列印輸出。該節案例使用TCP程式設計。 伺服器端-單執行緒 標頭檔案 #pragma once ///////////////////////////////////

istio原始碼分析pilot-discovery模組分析_Kubernetes中文社群

Istio是由Google/IBM/Lyft共同開發的新一代Service Mesh開源專案。 上次我們深入剖析了pilot-discovery的部分功能,這次讓我們一起來看看pilot-discovery的其他功能。 注:本文分析的istio程式碼版本為0.8.0,commit為0cd8d6

IOS開發入門六——storyboard的使用

    需要iOS開發視訊資料可以加我微信: 1914532832  驗證資訊請註明:IOS開發       上節我們瞭解了使用storyboard如何在單個頁面上放置檢視,並且設定這些檢視的屬性、位置約束等使之達到我們設計的效果。需要了解的人請點選"IOS開發入門之五——

VS2015動態程式設計匯出變數

本文章相關視訊教程下載地址http://pan.baidu.com/s/1slK2Hat 在動態庫中定義的全域性變數,可以在呼叫該動態庫的程式中進行訪問和修改。 1 在動態庫中定義匯出變數 在“VS2015動態庫之入口函式”中建立的DLL程式的基礎上,新增匯出變數。 1

VS2015動態程式設計Win32動態的使用

文章相關視訊教程下載地址:http://pan.baidu.com/s/1skKSrSh 4 動態庫的載入及呼叫 動態庫的載入分為靜態載入、動態載入兩種方式。 4.1 靜態載入動態庫 靜態載入動態庫的步驟包括:設定專案附加庫目錄;設定專案附加依賴項;移動DLL檔案以及

VS2015動態程式設計匯出C++類

文章相關視訊下載地址http://pan.baidu.com/s/1eSpHjt4 2 呼叫DLL程式的編寫 建立一個基於對話方塊的MFC程式,在該程式的介面中,輸入圓的半徑後,可以獲取該圓的周長

MFC規則動態

生成 相同id 內容 工作區 類庫 height http image 文件 一、概述   “是MFC的”意味著可以在這種DLL的內部調用MFC類庫中的內容;“是規則的”意味著它不同於MFC擴展DLL,在MFC規則DLL的內部雖然可以調用MFC類庫,但是其與應用程序的接口不

靜態連結的編譯與使用 linux下的動態連結和靜態連結到底是個什麼鬼?靜態連結的編譯與使用

linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用       知識不等於技術,這句話真的是越工作的時間長越深有體會,學習到的知識只有不斷的實踐,才成真正在自已的心裡紮下根,成為自身的一部分,所以無論如何,我希望我的部落格可以

動態規劃0-1揹包問題POJ3624

有N件物品和一個容積為M的揹包。第i件物品的體積w[i],價值是d[i]。求解將哪些物品裝入揹包可使價值總和最大。每種物品只有一件,可以選擇放或者不放。(N<=3500,M<=130000)。 解題思路: 用F[i][j]表示取前i種物品,使它們總體積不超過j的最優取法取

Python語言程式設計二--用turtle畫圍棋棋盤和正、餘弦函式圖形

這篇筆記依然是在做《Python語言程式設計》第5章迴圈的習題。其中有兩類問題需要記錄下來。 第一是如何畫圍棋棋盤。圍棋棋盤共有19縱19橫。其中,位於(0,0)的星位叫天元,其餘8個星位座標分別是:(-6,6),(0,6),(6,6),(-6,0),(6,0),(-6,-6),(0,-6),(6,-6)。

Matlab與C/C++混合程式設計Matlab呼叫OpenCV函式

研究計算機視覺的同學們對OpenCV和Matlab應該非常熟悉,OpenCV作為最大的計算機視覺開源庫已經得到了非常廣泛的使用,在視覺研究領域的地位不可動搖,其主要是基於C/C++實現的,主要的開發平臺包括VS,Qt等等。Matlab以其在矩陣運算方面獨有的優勢在影象處理領

QTP物件程式設計步驟生成器

 在QTP的物件庫程式設計中,存在著3種編寫程式碼的方式,依次分別是:步驟生成器、Complete Word、物件拖動生成 一個步驟生成器的例子: 1、新增一些物件到物件庫(上一篇介紹瞭如何新增物件

MVC排球比賽計分程序 ——使用框架,創建控制器,生成數據

tex count 實現 分享 left prot 博客 entry base 在上篇博客我們寫到,此軟件的數據庫連接我們使用的是EF框架,code first模式下,通過模型類,在創建controller的時候直接生成數據庫,完成數據庫的連接,與操作。 在使用EF框架之前