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