VS2010 C++創建、調(diao)用DLL圖解
以前(qian)做(zuo)Java,這(zhe)一段在搗鼓一個C++的(de)項目,需要調(diao)用其他(ta)項目組做(zuo)的(de)DLL文件,現(xian)將創建和調(diao)用DLL的(de)方法和步驟記(ji)錄如下。
一、創建DLL
1、新(xin)建(jian)項(xiang)(xiang)目(mu): Visual C++ -> Win32項(xiang)(xiang)目(mu),名稱:CnBlogsDLL

點擊完成,進入下一步。

注意不要點完(wan)了按(an)鈕,點擊下一步。

選中DLL單選框(kuang),然后(hou)點擊完(wan)成。這樣DLL項目的創(chuang)建工(gong)作就基本結束了(le)。
2、新建頭文件(jian):CommStruts.h
#pragma once
// 學生構造(zao)體
typedef struct {
// 學生(sheng)名稱
char Name[8];
// 學(xue)生年(nian)齢
int Age;
} Student;
3,新建源文(wen)件:ShowStudentInfo.cpp
#include "StdAfx.h"
#include <iostream>
#include " CommStruts.h "
using namespace std;
// 輸(shu)出學(xue)生信息
int ShowStudentInfo(Student * stud){
// 輸出學生(sheng)姓名
cout<<"Name : "<<stud->Name<<endl;
// 輸出學生年(nian)齡
cout<<"Age : "<<stud->Age<<endl;
// 返(fan)回學(xue)生年齡
return stud->Age;
}
4、新建模塊定(ding)義文件:

點擊(ji)追加,然后輸入如下(xia)代碼:
LIBRARY CnBlogsDll
EXPORTS
ShowStudentInfo
LIBRARY是模(mo)塊(kuai)定(ding)義文件(jian)(jian)(jian)必須(xu)的(de)一(yi)(yi)部(bu)分(fen)(fen),它告訴鏈接器(linker)如何命名你的(de)DLL。EXPORTS也(ye)是模(mo)塊(kuai)定(ding)義文件(jian)(jian)(jian)必須(xu)的(de)一(yi)(yi)部(bu)分(fen)(fen),這部(bu)分(fen)(fen)使得該函(han)數(shu)可(ke)以被其(qi)它應(ying)用(yong)(yong)程序(xu)(xu)訪問到并且它創(chuang)建一(yi)(yi)個(ge)導(dao)(dao)(dao)入庫。當你生成這個(ge)項目時,不僅是一(yi)(yi)個(ge).dll文件(jian)(jian)(jian)被創(chuang)建,而且一(yi)(yi)個(ge)文件(jian)(jian)(jian)擴展名為.lib的(de)導(dao)(dao)(dao)出(chu)庫也(ye)會被創(chuang)建。EXPORTS后面列出(chu)要導(dao)(dao)(dao)出(chu)函(han)數(shu)的(de)名稱。可(ke)以在.def文件(jian)(jian)(jian)中(zhong)的(de)導(dao)(dao)(dao)出(chu)函(han)數(shu)名后加@n,表示要導(dao)(dao)(dao)出(chu)函(han)數(shu)的(de)序(xu)(xu)號為n(在進(jin)行函(han)數(shu)調用(yong)(yong)時,這個(ge)序(xu)(xu)號將發(fa)揮其(qi)作用(yong)(yong))。
5、最后編譯,生成CnBlogsDLL.dll和CnBlogsDLL.lib文件
二、調用DLL
1、創(chuang)建CLR控制臺應用程序:ExecutDll。

當(dang)然,創建(jian)其他的應用程序(xu)也是可(ke)以的,這里(li)只是舉(ju)例(li)說(shuo)明(ming)。
2、添加已(yi)有項目CommStruts.h,此文件是上面個創(chuang)建DLL是建立的構造體文件。
3、在main方法中添加如下(xia)代碼:
// 加載DLL
HINSTANCE hInstance = LoadLibrary("CnBlogsDLL.dll");
// 定義顯示(shi)學生信息的方法
typedef int (*ShowStudentInfo)(Student * );
// 取得DLL中先(xian)生學(xue)生信息(xi)的方(fang)法,并(bing)映射成本地的方(fang)法
ShowStudentInfo showStudentInfo = (ShowStudentInfo)GetProcAddress(hInstance, "ShowStudentInfo");
// 創建學生信息
Student stud;
// 初始化
memset(&stud, 0x00, sizeof(Student));
stud.Age = 100;
memcpy(stud.Name,"WGC",sizeof(stud.Name));
// 執(zhi)行顯示學生信息的方法
int age = showStudentInfo(&stud);
這(zhe)里(li)使用的是動態(tai)加(jia)載DLL的方法。
4、將編譯完成的(de)CnBlogsDLL.dll拷貝到ExecutDll工(gong)程的(de)Debug目錄下。如果使(shi)用靜態加載(zai)DLL的(de)方法,還需要拷貝CnBlogsDLL.lib文件。
5、編譯運(yun)行。運(yun)行結(jie)構如下圖:

三、小結
調用DLL的(de)時候,有(you)(you)可能會出現"FatalExecutionEngineError"的(de)錯(cuo)誤,極(ji)有(you)(you)可能是(shi)參數造成的(de),尤其(qi)是(shi)使用指(zhi)針(zhen)的(de)時候,更需要多加小心。
這里(li)只(zhi)是簡單的介紹了創建(jian)和調(diao)用DLL的部分內容。希望能對DLL初(chu)學者有所幫組。
歡迎轉載,請注明出處!
感謝您的閱讀,請關注后續博客!
共享視頻教程請訪問:
