VS2012中工程呼叫另一個工程的DLL檔案
建立動態庫方法:
建立動態庫是生成 .dll .lib 兩個個檔案
檔案 -> 新建 -> 專案 -> win32控制檯應用程式 專案名稱:DLLGenerator
應用程式型別:DLL 附加選項:空專案
建立原始檔dllgenerator.cpp(不需要主函式,只寫你需要動態呼叫的函式)
- // 整數加法和乘法
- int Add(int a, int b){
- return a + b;
- }
- int Mul(int c, int d){
- return c * d;
- }
建立頭文dllgenerator.h(一定要把函式宣告寫好)
- int Add(int, int);
- int Mul(int, int);
建立原始檔dllmain.cpp(一定要包含#include<windows.h>)
- 下面的函式是VS2013自動生成,沒生成複製即可。其實是在建立工程專案時不選空專案時候vs自動生成的,但不選空專案會產生很多其他檔案和依賴項,本文教你建立最純淨的工程,注意包含window.h
- // dllmain.cpp : 定義 DLL 應用程式的入口點。
- #include <windows.h>
- BOOL APIENTRY DllMain(HMODULE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- switch (ul_reason_for_call)
- {
- case DLL_PROCESS_ATTACH:
- case DLL_THREAD_ATTACH:
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
建立原始檔Source.def
- 建立方式如下圖,選擇 VisualC++ -> 模組定義檔案(.def)
- 在此檔案第一行引號中填你的專案名稱即可,EXPORTS下面列出要生成的函式名稱 格式:“名稱 @序號”)
[cpp] view plain copy
- LIBRARY "DLLGenerator"
- EXPORTS
- Add @1
- Mul @2
點選選單欄 生成 -> 生成解決方案 或者 按Ctrl+F5
輸出欄顯示 建立庫 DLLGenerator.lib 和 生成 DLLGenerator.dll
lib檔案裡面有對dll檔案的描述,所以生成的dll檔案不要改名稱,否則lib檔案和dll檔案無法對應
在專案方案目錄裡,Debug資料夾中可以找到DLLGenerator.lib 和 DLLGenerator.dll, 把這兩個檔案和工程的標頭檔案(dllgenerator.h)移動到一個空資料夾(E:\dlltest\DLL)中,以後你的專案用到此dll就包含這個目錄,至此動態庫建立完畢。
專案呼叫動態庫方法如下:
呼叫動態庫是呼叫 .dll .lib .h 三個檔案
檔案 -> 新建 -> 專案 -> win32控制檯應用程式 專案名稱:DLLTestor
應用程式型別:控制檯應用程式 附加選項:空專案
開啟專案 -> 專案屬性 -> 配置屬性 -> VC++目錄 -> 包含目錄 加入DLLGenerator.h所在目錄的絕對路徑 (E:\dlltest\DLL),以分號間隔
開啟專案 -> 專案屬性 -> 配置屬性 -> VC++目錄 -> 庫目錄 加入DLLGenerator.lib所在目錄的絕對路徑 (E:\dlltest\DLL)
開啟專案 -> 專案屬性 -> 配置屬性 -> 連結器 -> 輸入 -> 附加依賴項 中填上DLLGenerator.lib(以分號間隔),點選右下角 應用 確定
工程呼叫dll時首先在工程檔案目錄中查詢dll,找不到後在C:\Windows\System32 中找。所以我們自己專案簡單呼叫dll時就把生成的dll檔案複製到工程目錄中,如果經常用可以把dll檔案放到C:\Windows\System32中
新建原始檔main.cpp
[cpp] view plain copy
- #include<iostream>
- #include"dllgenerator.h"
- using namespace std;
- int main(){
- int a = 2;
- int b = 3;
- cout << Add(a, b) << endl;
- cout << Mul(a, b) << endl;
- }
點選選單欄,除錯 -> 開始執行(不除錯) 或者按F5
執行結果:
至此呼叫動態庫成功。
---------------End-----------------