c++顯式加載dll并使用DLL的類

轉載自:


http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/

首先需要強調,當使用某個類時一般目的有二:實例化成對象或者繼承它產生新類。
對于前者,我們可以構造一個抽象類(java里的接口)來連接調用方和DLL。
// Interface.h?公共文件/ 公共接口

// 下列 ifdef 塊是創建使從 DLL 導出更簡單的
// 宏的標準方法。此 DLL 中的所有文件都是用命令行上定義的 INTERFACE_EXPORTS
// 符號編譯的。在使用此 DLL 的
// 任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將
// INTERFACE_API 函數視為是從 DLL 導入的,而此 DLL 則將用此宏定義的
// 符號視為是被導出的。
#ifdef INTERFACE_EXPORTS
#define INTERFACE_API __declspec(dllexport)
#else
#define INTERFACE_API __declspec(dllimport)
#endif#pragma onceclass Interface
{
public:virtual void ShowMsg() = 0; // 將調用方需要調用的成員函數聲明成純虛函數virtual ~Interface(){};// 抽象類的虛析構函數
};
extern "C" INTERFACE_API Interface* Export(void);
// Interface.cpp?被調用方文件


//?注意下面的代碼并不是實現 Interface 類,而是因為聯系緊密才寫在這。

// Interface.cpp : 定義 DLL 應用程序的導出函數。
//#include "stdafx.h"
#include "Interface.h"
#include <iostream>
#include "test.h"// 通過導出函數形式向調用方提供指向派生類對象的基類指針
Interface* Export(void)
{return (Interface*)new Test();
}

將真正要調用的類聲明成抽象類?Interface 的派生類:

#pragma once
#include "Interface.h"
#include <string>
class Test :public Interface
{
public:Test();virtual ~Test();virtual void ShowMsg(void);
private:std::string s;
};

// Test.cpp?被調用方文件


//?類的實現
#include "stdafx.h"
#include "test.h"
#include <iostream>Test::Test()
{s = "hello form dll";
}Test::~Test()
{std::cout << "destroy";
}void Test::ShowMsg()
{std::cout << s << std::endl;
}


調用方調用DLL時動態加載:

#include <Windows.h>
#include <iostream>
#include "Interface.h" // 包含抽象類從而使用接口// 在調用處添加如下代碼
using pExport = Interface* (*)(void); // 定義指向導出函數的指針類型int main()
{HINSTANCE hDll = LoadLibrary("Interface.dll");// 加載DLL庫文件,DLL名稱和路徑用自己的if (hDll == NULL){std::cout << "load dll fail \n";return -1;}pExport Get = (pExport)GetProcAddress(hDll, "Export");// 將指針指向函數首地址if (Get == NULL){std::cout << "load address fail \n";return -1;}Interface *t = Get();// 調用導出函數獲得抽象類指針t->ShowMsg();// 通過該指針調用類成員函數delete t; // 釋放DLL中生成的對象FreeLibrary(hDll); //釋放庫句柄system("pause");return 0;
}


此時需要注意兩點:

1.我們需要把Interface.h放在UseDLL工程目錄下

2.如果編譯時出現:無法將參數 1 從“const char [14]”轉換為“LPCWSTR”的錯誤,則我們需要

點擊項目屬性,常規-》字符集-》改為“未設置”即可

實際上整個項目的方法是Interface完成了接口的設置,而具體的實現在test中進行,真正使用了類的抽象性和多態性,封閉性。

項目下載路徑:http://7xs15g.com1.z0.glb.clouddn.com/Interface.zip

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Debian上安裝配置ownCloud

如何在Debian上安裝配置ownCloud 據其官方網站&#xff0c;ownCloud可以讓你通過一個Web界面或者WebDAV訪問你的文件。它還提供了一個平臺&#xff0c;可以輕松地查看、編輯和同步您所有設備的通訊錄、日歷和書簽。盡管ownCloud與廣泛使用Dropbox非常相似&#xff0c;但主要區別…

jQuery相當于對 javascript二次開發,所以基于 jQuery實現的各種插件直接調用即可...

jQuery相當于對 javascript二次開發&#xff0c;所以基于 jQuery實現的各種插件直接調用即可轉載于:https://www.cnblogs.com/npk19195global/p/4482363.html

[轉]js判斷url是否有效

本文轉自&#xff1a;http://www.cnblogs.com/fumj/p/3490121.html 方法一:(僅適用于ie) function CheckStatus(url){XMLHTTP new ActiveXObject("Microsoft.XMLHTTP")XMLHTTP.open("HEAD",url,false)XMLHTTP.send()return XMLHTTP.status200}function Ne…

VS中lib和dll

轉載&#xff1a; &#xfeff;&#xfeff;http://www.cnblogs.com/Yogurshine/archive/2013/06/14/3136025.html Lib文件 先來說一說lib文件&#xff0c;C中lib文件主要有兩類&#xff0c;一種是靜態的編譯連接&#xff0c;叫做靜態鏈接庫&#xff0c;另一種是動態的編譯鏈…

32位md5解密_冰蝎特征檢測及報文解密

點擊“藍字”關注我們&#xff0c;不迷路~??前言19年駐場于某金融單位。參加19年9月、11月兩次攻防演練&#xff0c;負責攻防演練組織、技術支持和復盤。期間&#xff0c;多個攻擊隊伍使用冰蝎 webshell &#xff0c;防守方監測時確實各 IDS 確實報出 webshell 連接&#xff…

使用extern C改善顯式調用dll

extern "C"的簡單解析 我們前面介紹了顯式調用dll的方法&#xff0c;例如 &#xfeff;&#xfeff;http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html &#xff0c;其中在GetProcAddress第二個參數的填寫煞費苦心&#xff0c;我們需要比較麻煩…

《移動App測試的22條軍規》—App測試綜合案例分析23.13節測試微信App的流量和電量消耗...

本節書摘來自異步社區《移動App測試的22條軍規》一書中的App測試綜合案例分析&#xff0c;第23.13節測試微信App的流量和電量消耗&#xff0c;作者黃勇&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 23.13 測試微信App的流量和電量消耗關于微信App消耗流…

UVA 10269 Super Mario,最短路+動態規劃

這個題目我昨晚看到的&#xff0c;沒什么思路&#xff0c;因為馬里奧有boot加速器&#xff0c;只要中間沒有城堡&#xff0c;即可不耗時間和腳力&#xff0c;瞬間移動不超過L距離&#xff0c;遇見城堡就要停下來&#xff0c;當然不能該使用超過K次。。。我糾結了很久&#xff0…

python做數據可視化的代碼_Python數據可視化正態分布簡單分析及實現代碼

Python說來簡單也簡單&#xff0c;但是也不簡單&#xff0c;尤其是再跟高數結合起來的時候。。。 正態分布&#xff08;Normaldistribution&#xff09;&#xff0c;也稱“常態分布”&#xff0c;又名高斯分布&#xff08;Gaussiandistribution&#xff09;&#xff0c;最早由A…

ACdream 1061(abs用法)

題目鏈接&#xff1a;http://acdream.info/problem?pid1061 主要是abs用法&#xff0c;看題目的數據 long long的最大值&#xff1a;9223372036854775807 long long的最小值&#xff1a;-9223372036854775808 unsigned long long的最大值&#xff1a;18446744073709551615 由題…

wpf window 不執行show 就不能load執行_Numpy反序列化命令執行漏洞分析(CVE-2019-6446)附0day...

1、介紹 NumPy 是 Python 機器學習庫中之一&#xff0c;主要對于多為數組執行計算。NumPy 提供大量的 函數和操作&#xff0c;能夠幫助程序員便利進行數值計算。在 NumPy 1.16.0 版本之前存在反序列化 命令執行漏洞&#xff0c;用戶加載惡意的數據源造成命令執行。2、環境 軟件…

使用Def文件導出dll

前面我們介紹了dll的生成&#xff0c;大多數是使用extern "C"__declspec(dllexport)函數名的方法導出dll。其實我們還有另一種方法來導出dll。 先介紹參考文獻&#xff1a; 1.dll導出聲明相關 2.VS2012中 C創建DLL圖解 3.DLL中導出函數的兩種方式(dllexport與.…

HDU 1003 Maxsum

題目大意&#xff1a;求出數列的最大子段和&#xff0c;并且說明是從第幾項至第幾項。 題解1&#xff1a;簡單貪心。 #include <cstdio> #define rep(i,n) for(int i1;i<n;i) int main(){int t,l0;scanf("%d",&t);while(t--&&l){if(l!1)printf…

《JavaScript面向對象精要》——1.8 原始封裝類型

本節書摘來自異步社區《JavaScript面向對象精要》一書中的第1章&#xff0c;第1.8節&#xff0c;作者&#xff1a;【美】Nicholas C. Zakas著&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.8 原始封裝類型 JavaScript中一個最讓人困惑的部分可能就是原始…

XML語法學習

本文章集合兩篇博文而寫&#xff0c;兩篇博文地址&#xff1a; XML學習總結(二)——XML入門&#xff1a; XML基礎<第一篇> XML簡介 XML是一種標記語言&#xff0c;用于描述數據&#xff0c;它提供一種標準化的方式來來表示文本數據。XML文檔以.xml為后綴。需要徹底注…

FM實現F4幫助系列三:彈出框多篩選…

FM實現F4幫助系列三&#xff1a;彈出框多篩選條件的搜索幫助&#xff08;根據搜索幫助篩選字段&#xff09;函數&#xff1a;F4IF_GET_SHLP_DESCRF4IF_START_VALUE_REQUEST效果圖&#xff1a;本例子代碼&#xff1a;找到需要的幫助:*&------------------------------------…

[數分提高]2014-2015-2第9教學周第1次課 (2015-04-28)

設 $$\bex a,b>0,\quad 0\leq f\in \calR[a,b],\quad \int_a^b xf(x)\rd x0. \eex$$ 試證: $$\bex \int_a^b x^2f(x)\rd x\leq ab \int_a^b f(x)\rd x; \eex$$ 并給出使得下列不等式成立的 (您認為的) 最優數: $$\bex \int_a^b x^3f(x)\rd x\leq (\quad) \int_a^b f(x)\rd x…

《計算復雜性:現代方法》——0.2 判定問題/語言

本節書摘來自華章計算機《計算復雜性&#xff1a;現代方法》一書中的第0章&#xff0c;第0.2節&#xff0c;作者 &#xff3b;美&#xff3d;桑杰夫阿羅拉&#xff08;Sanjeev Arora&#xff09;&#xff0c;博阿茲巴拉克&#xff08;Boaz Barak&#xff09;&#xff0c;譯 駱吉…

python從date目錄導入數據集_使用python劃分數據集

無論是訓練機器學習或是深度學習&#xff0c;第一步當然是先劃分數據集啦&#xff0c;今天小白整理了一些劃分數據集的方法&#xff0c;希望大佬們多多指教啊&#xff0c;嘻嘻~ 首先看一下數據集的樣子&#xff0c;flower_data文件夾下有四個文件夾&#xff0c;每個文件夾表示一…

開源牛人 zcbenz

事情是這樣的&#xff0c;微軟推出了Visual Studio Code&#xff0c;我很好奇他怎么做跨平臺的&#xff0c;所以就找找資料&#xff0c;在他的網站中是這么描述的&#xff1a; Architecturally, Visual Studio Code combines the best of web, native, and language-specific t…