動態鏈接庫dll的 靜態加載 與 動態加載


 

dll 兩種鏈接方式  : 動態鏈接和靜態鏈接(鏈接亦稱加載)

動態鏈接是指在生成可執行文件時不將所有程序用到的函數鏈接到一個文件,因為有許多函數在操作系統帶的dll文件中,當程序運行時直接從操作系統中找。  
靜態鏈接就是把所有用到的函數全部鏈接到exe文件中。
動態鏈接是只建立一個引用的接口,而真正的代碼和數據存放在另外的可執行模塊中,在運行時再裝入;  
而靜態鏈接是把所有的代碼和數據都復制到本模塊中,運行時就不再需要庫了。
 

1. 生成  靜態鏈接庫 lib 和動態鏈接庫 dll
 
新建工程 ( newdll)  win32項目 ->  dll

添加.h文件 
betabinlib.h

 

 

#ifndef BETABINLIB_H
#define BETABINLIB_H
 
#ifdef NEWDLL_EXPORTS   //自動添加的宏   右鍵工程-屬性-配置屬性-預處理器-..定義
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif
 
MYDLL_API int add(int x, int y);  // 必須加前綴
#endif


添加.cpp文件  betabinlib.cpp

 

 

#include "stdafx.h"
#include "betabinlib.h"
 
int add(int x, int y)
{
    return x + y;
}

 

編譯生成  .dll 和 . lib文件
 
2. 使用

(1)dll的靜態加載--將整個dll文件 加載到  .exe文件中
特點:程序較大,占用內存較大,但速度較快(免去 調用函數LOAD LIB等)
測試:
需要  . lib  和 .dll兩個文件     (. lib 做 引導用),.h文件

main.cpp

 

 

#include <stdio.h>
#include "betabinlib.h"
#include <Windows.h>
#pragma comment(lib, "newdll.lib")
 
int main()
{
    printf("2 + 3 = %d \n", add(2, 3));
    return 0;
}

 

 

(2) dll的動態加載--根據需要加載響應函數,隨時可卸載。不會因為找不到dll, 導致程序不能運行(需要自己做判斷處理)。

只需要 .lib文件,不需要 .h文件

main.cpp
#include <stdio.h>
#include <Windows.h>
 
int main()
{
    HINSTANCE h=LoadLibraryA("newdll.dll");
    typedef int (* FunPtr)(int a,int b);//定義函數指針
 
    if(h == NULL)
    {
    FreeLibrary(h);
    printf("load lib error\n");
    }
    else
    {
        FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
        if(funPtr != NULL)
        {
            int result = funPtr(3, 3);
            printf("3 + 3 = %d \n", result);
        }
        else
        {
            printf("get process error\n");
            printf("%d",GetLastError());
        }
        FreeLibrary(h);
    }
 
    return 0;
}



 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM