程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> visual c++ 動態鏈接庫調用總結

visual c++ 動態鏈接庫調用總結

編輯:C++入門知識

     由於每次使用動態鏈接庫的時候都要重新去查資料,查調用方式,有些煩躁,本人抽點時間在此做個總結,希望可以對需要的朋友有所幫助。
1,顯式加載方式加載動態鏈接庫

簡單易懂,隨掉隨用

(1)          將dll考到當前工作目錄,或者使用GetModuleFileName函數獲取當前執行目錄得到相對路徑,亦或者使用絕對路徑進行加載。

(2)          得到dll實例句柄

HMODULE LoadLibrary( LPCTSTR lpFileName )

( 3 ) 獲取dll中導出函數的地址

FARPROC GetProcAddress( HMODULE hModule,LPCSTR lpProcName )

Ex:typedef int (*ADDPROC)( int a, int b )

ADDPROC Add=(ADDPROC)GetProcAddress(hinst,”add”);

(4)FreeLibrary()調用結束釋放實例。

2         隱式加載方式加載動態鏈接庫

一:基本調用流程

(1)      使用_declspec(dllexport)導出函數

比如

_declspec(dllexport) int add( int a,  int b  )

添_stdcall extern c可有效解決名字改編問題

_stdcall extern c _declspec(dllexport) int add( int a,  int b  )

 

(2)  將dll文件考到當前工程,並連接lib文件

Vc6可以通過link連接,vs系列可以通過依賴庫連接

或者使用一種通用的方式加載,通過路徑加載

#pragma comment(lib,"../SDK/Sadp.lib")

(3)在調用處用extern做外部定義聲明

    Ex:extern int add( int a , int b )

   或者_declspec(dllimport) int add( int a,  int b  )

二:模塊定義文件(可有效解決名字改編問題)參考網絡通信庫

Library xxx.dll

EXPORTS

Add。。。。

3         顯式加載和隱式加載的比較

個人比較崇尚顯示加載兩個原因:

1,        隨掉隨用,易懂,並且不會因為某一個導出函數的調用的失敗導致程序的崩潰

2,        節省內存,調用結束直接釋放實例,而隱式加載從程序開始運行就一直伴隨著程序的整個過程,當dll比較多的時候很浪費內存。

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved