C/C++:Windows编程—调用DLL程序的2种方法
前言
先簡(jiǎn)單介紹下DLL。DLL:Dynamic Link Library 動(dòng)態(tài)鏈接庫(kù) 是一個(gè)被其他應(yīng)用程序調(diào)用的程序模塊,其中封裝了可以被調(diào)用的資源或函數(shù)。DLL 文件屬于可執(zhí)行文件,它符合Windows系統(tǒng)的PE文件格式,不過(guò)它是依附于EXE文件創(chuàng)建的的進(jìn)程來(lái)執(zhí)行的,不能單獨(dú)運(yùn)行。為了演示調(diào)用DLL程序的2種方法,我們先建一個(gè)簡(jiǎn)單的DLL程序。
建一個(gè)簡(jiǎn)單的DLL程序
IDE 使用vs2015,新建工程DLLTest1,選擇空項(xiàng)目,創(chuàng)建完畢 右擊項(xiàng)目 -> 屬性 -> 常規(guī) -> 配置類型 選擇 動(dòng)態(tài)庫(kù).dll。還是上一張圖吧。
添加頭文件Calc.h 在頭文件中添加導(dǎo)出函數(shù)add函數(shù)
#pragma onceextern "C" __declspec(dllexport) int add(int a, int b);cpp文件中進(jìn)行實(shí)現(xiàn)
#include "Calc.h"int add(int a, int b) {return a + b; }生成解決方案,在Debug下生成 DLLTest1.dll和DLLTest1.lib
對(duì)DLL程序調(diào)用方式一
同樣是新建空項(xiàng)目,添加main.cpp文件,將 DLLTest1.dll和DLLTest1.lib 拷貝到工程代碼目錄,然后項(xiàng)目添加添加現(xiàn)有項(xiàng)。項(xiàng)目目錄如下
在這里插入圖片描述
使用代碼如下:
#include <stdio.h> #include <stdlib.h> #include <Windows.h>#pragma comment(lib,"DLLTest1.lib")extern "C" int add(int a, int b);// 靜態(tài)調(diào)用DLL庫(kù) void StaticUse() {int sum = add(10, 20);printf("靜態(tài)調(diào)用,sum = %d\n", sum); }方式一 是靜態(tài)調(diào)用,在連接階段 將DLL庫(kù)信息編寫(xiě)到EXE文件中,當(dāng)調(diào)用DLL庫(kù)中的函數(shù)是會(huì)加重DLL庫(kù)。#pragma comment(lib,“DLLTest1”)告訴連機(jī)器需要在FirstDll.lib文件中找到DLL中導(dǎo)出函數(shù)的信息。
對(duì)DLL程序調(diào)用方式二
方法一屬于靜態(tài)調(diào)用,其方式是通過(guò)鏈接器將DLL函數(shù)的導(dǎo)出函數(shù)寫(xiě)進(jìn)可執(zhí)行文件。現(xiàn)在使用第二種方式,相對(duì)前一種 是動(dòng)態(tài)調(diào)用。動(dòng)態(tài)調(diào)用不是鏈接時(shí)完成的,而是在運(yùn)行時(shí)完成的。動(dòng)態(tài)調(diào)用不會(huì)在可執(zhí)行文件中寫(xiě)入DLL相關(guān)的信息。代碼如下:
// 動(dòng)態(tài)調(diào)用DLL庫(kù) void DynamicUse() {// 運(yùn)行時(shí)加載DLL庫(kù)HMODULE module = LoadLibrary("DLLTest1.dll");if (module == NULL){printf("加載DLLTest1.dll動(dòng)態(tài)庫(kù)失敗\n");return;}typedef int(*AddFunc)(int, int); // 定義函數(shù)指針類型AddFunc add; // 導(dǎo)出函數(shù)地址add = (AddFunc)GetProcAddress(module, "add");int sum = add(100, 200);printf("動(dòng)態(tài)調(diào)用,sum = %d\n",sum); }用到了以下2個(gè)函數(shù):
// 根據(jù)DLL文件名 加載DLL // suc,返回一個(gè)模塊句柄 HMODULE WINAPI LoadLibrary(_In_ LPCTSTR lpFileName ); // suc,返回lpProcName指向的函數(shù)名的函數(shù)地址。 FARPROC GetProcAddress(HMODULE hModule,LPCSTR lpProcName );測(cè)試
測(cè)試代碼如下:
#include <stdio.h> #include <stdlib.h> #include <Windows.h>#pragma comment(lib,"DLLTest1.lib")extern "C" int add(int a, int b);// 靜態(tài)調(diào)用DLL庫(kù) void StaticUse() {int sum = add(10, 20);printf("靜態(tài)調(diào)用,sum = %d\n", sum); }// 動(dòng)態(tài)調(diào)用DLL庫(kù) void DynamicUse() {HMODULE module = LoadLibrary("DLLTest1.dll");if (module == NULL){printf("加載DLLTest1.dll動(dòng)態(tài)庫(kù)失敗\n");return;}typedef int(*AddFunc)(int, int); // 定義函數(shù)指針類型AddFunc add;add = (AddFunc)GetProcAddress(module, "add");int sum = add(100, 200);printf("動(dòng)態(tài)調(diào)用,sum = %d\n", sum); }int main(char argc, char* argv[]) {StaticUse();DynamicUse();system("pause");return 0; }驗(yàn)證結(jié)果,和我們想象的一樣。
完整項(xiàng)目
如果 有需要,這個(gè)2個(gè)工程這里下載。
總結(jié)
以上是生活随笔為你收集整理的C/C++:Windows编程—调用DLL程序的2种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用Dpkt解析包
- 下一篇: Linux下进程隐藏的常见手法及侦测手段