Code - Windows 動態庫建立與使用

建立部分:
1.使用導出函數關鍵字_declspec(dllexport)建立:程序員

//DllTest.h
extern "C" _declspec(dllexport) int Max(int a, int b); //導出聲明
extern "C" _declspec(dllexport) int Min(int a, int b); 

//DllTest.cpp
#include "DllTest.h"

int Max(int a, int b) 
{
    return (a>=b)?a:b;
}

int Min(int a, int b) 
{
    return (a<=b)?a:b;
}

2.使用模塊文件(;後的一行表明註釋)  VS2012 沒有實驗成功函數

;DllTest.def
LIBRARY DllTest

EXPORTS
Max@1
Min@2
spa

.def 文件的規則爲:
(1)LIBRARY 語句說明.def 文件相應的 DLL;
(2)EXPORTS 語句後列出要導出函數的名稱。能夠在.def 文件中的導出函數名後加@n,表示要導出函數的序號爲 n(在進行函數調用時,這個序號將發揮其做用);
(3).def 文件中的註釋由每一個註釋行開始處的分號 (;) 指定,且註釋不能與語句共享一行。
.net

 

 

使用部分:指針

採用隱式連接方式創建一個DLL文件,連接程序會自動生成一個與之對應的LIB導入文件。該文件包含了每個DLL導出函數的符號名和可選的標識號,可是並不含有實際的代碼。LIB文件做爲DLL的替代文件被編譯到應用程序項目中。code

//UseDll.h 聲明
#pragma comment(lib,"DllTest.lib") 
extern "C"_declspec(dllimport) int Max(int a,int b); //導入聲明
extern "C"_declspec(dllimport) int Min(int a,int b); 

//UseDll.cpp
#include"Dlltest.h" 
void main() 
{ 
    printf("MinValue:%d\n",min(8,10) ); 
}

顯式連接,程序員就沒必要再使用導入文件,而是直接調用Win32的LoadLibary函數,並指定DLL的路徑做爲參數。LoadLibary返回HINSTANCE參數,應用程序在調用GetProcAddress函數時使用這一參數。GetProcAddress函數將符號名或標識號轉換爲DLL內部的地址。get

#include "stdafx.h"
#include <Windows.h>
typedef int(*pMax)(int a,int b);//定義與動態庫中的函數類型相同的指針類型

int _tmain(int argc, _TCHAR* argv[])
{
    pMax MaxFunc;
    HINSTANCE   hDLL; //DLL 句柄
    hDLL=LoadLibrary("TestDemo_CreateDll.Dll");//加載動態連接庫文件
    MaxFunc=(pMax)GetProcAddress(hDLL,"Max"); 
    int MaxValue=MaxFunc(5,8); 
    printf("兩數最大值:%d\n",MaxValue); 
    FreeLibrary(hDLL);//卸載Dll文件
    return 0;
}
相關文章
相關標籤/搜索