動態鏈結庫的編寫及使用(c )

2021-07-25 04:08:05 字數 1938 閱讀 6070

一、編寫動態鏈結庫

mydll.cpp:

//dll的入口點

bool apientry dllmain( handle hmodule,

dword ul_reason_for_call,

lpvoid lpreserved

)return true;

}int myadd(int a,int b)

int __stdcall mysub(int a,int b)//這裡只是為了說明使用__stdcall的情況

1.若函式使用了win32 api,則函式應使用__stdcall修飾

2.__stdcall會改變函式符號

3.因為c++在匯出函式時會改變函式符號,應當用 extern "c"修飾

4.extern "c"和__stdcall不能同時修飾函式(有時候還是會改變函式符號)

5.用.def檔案匯出函式不會修改函式符號

mydlllib.h://隱式呼叫時需要包含的標頭檔案

//這裡僅僅是隱式呼叫dll時的標頭檔案,如果要顯示呼叫,應當再編寫乙個標頭檔案供外部使用

#pragma once

#pragma comment(lib,"mydll.lib")//這裡需要將mydll.lib放到exe檔案相同目錄

extern "c" __declspec(dllimport) int myadd(int,int); //宣告乙個可以匯出的方法

extern "c" __declspec(dllimport) int __stdcall mysub(int,int); //tt

mydll.h://顯式呼叫時需要包含的標頭檔案

#pragma once

typedef int (* dll_myadd) (int,int);//這裡加dll_只是為了在後面定義函式的時候可以取myadd這個變數名

typedef int (__stdcall* dll_mysub) (int,int);

拓展:使用__declspec(dllexport)匯出函式的方法

在mydll.cpp新增

#define dll_api extern "c" __declspec(dllexport)

寫成:

#pragma once

#ifdef dll_api

#else

#pragma comment(lib,"mydll.lib")//這裡需要將mydll.lib放到exe檔案相同目錄

#define dll_api extern "c" __declspec(dllimport)

#endif

dll_api int myadd(int,int); //宣告乙個可以匯出的方法

dll_api int __stdcall mysub(int,int); //tt

mydll.h不變

二、使用動態鏈結庫

隱式呼叫:

1.包含mydlllib.h

2.將mydll.lib和mydll.dll複製到exe相同目錄

顯示呼叫:

1.包含mydll.h//不包含的話要自己typedef,不嫌麻煩的話也可以

2.將mydll.dll複製到exe相同目錄

3.呼叫時:

hinstance hinstdll;//獲取dll

dll_myadd myadd;//定義函式名

dll_mysub mysub;//定義函式名

hinstdll = loadlibrary("sampledll.dll");

if (hinstdll != null)

編寫動態鏈結庫

很多時候我們寫 的時候會經常用到某些 段,比方說求兩個或幾個整數的和或者將乙個整形陣列轉化為二叉樹等等。經常使用這些 但是每一次又得重新再寫一遍,次數多了等於就是重複無用勞動了。所以,可以自己動手寫乙個自己的動態鏈結庫,儲存起來。下次用到只需要加上庫就ok了,這樣既方便了自己又對動態鏈結庫本身的工作...

靜態鏈結庫和動態鏈結庫編寫

lib.h int add int x,int y lib.cpp include lib.h include stdafx.h int add int x,int y libtest.cpp include lib.h pragma comment lib,lib.lib int main int...

C 動態鏈結庫的建立及使用

1 開啟vs2013,新建類庫,命名為 mydll 2 寫類庫 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespa...