動態庫的創建和調用


VC++支持的DLL:

VC++支持三種DLL:

1非MFC動態庫

2MFC規則DLL

3MFC擴展DLL。

DLL導出函數(或變量、類)可供應用程序調用;DLL內部函數只能在DLL程序內使用,應用程序無法調用它們。

 

導出函數的聲明方式:

1一種在函數聲明類型和函數名之間加上“_declspec(dllexport)”。

2另外一種采用模塊定義(.def)文件聲明,需要在庫工程中添加模塊文件,格式如下:

  LIBRARY 庫工程名稱

  EXPORTS 導出函數名

 

DLL的調用方式:

靜態調用中,由編譯系統完成對DLL的加載和應用程序結束時DLL的卸載。

動態調用中,由編程者用API函數加載和卸載DLL(DLL加載—DLL函數地址獲取—DLL釋放)方式。

例子

 創建動態鏈接庫(MFC規則DLL)

1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL

2. def文件中添加:函數名(FunctionName)

3. h文件中添加:外部函數聲明//求和函數,函數名為FunctionName

  extern "C" __declspec(dllexport) int __stdcall FunctionName();

4. cpp文件中添加: 外部函數實現

  extern "C" __declspec(dllexport) int __stdcall FunctionName(int a,int b)

  {

    print("don something here");

  }

5. build--set active configuration--win32 release--ok

6. 生成

7. 根目錄下release文件夾中dll,lib與根目錄下h文件即為所需

創建動態鏈接庫(非MFC DLL)

1. new---projects---win32 dynamic-link library----an empty project(Sample)

2. 添加sample.h

#ifndef SAMPLE_H

#define SAMPLE_H

extern int dllGlobalVar;

#endif

3. 添加 sample.cpp

#include "sample.h"

#include <windows.h>

int dllGlobalVar;

bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

//windows在加載DLL時,需要一個入口函數,就如同控制台或DOS程序需要main函數、win32程序需要winmain函數一樣。所以引入一個不做任何操作的缺省DllMain的函數版本。是DLL的內部函數。

調用動態鏈接庫(把MFC_dll.dll和MFC_dll.lib拷到工程所在目錄)

//靜態調用(.h可以寫到.cpp文件中)

1. new--projects--win32 console application--an empty project

2. 添加h文件:(test.h)

#pragma comment(lib,"XXXX.lib") //告訴編譯器DLL相對應的lib文件所在路徑和文件名

extern "C" _declspec(dllimport) int _stdcall FunctionName();//聲明導入函數

3. 添加cpp文件:(main.cpp)

#include "test.h"

int main()

{

cout<<Add_new(10,3);

return 0;

}

//動態調用

#include <stdio.h>

#include <windows.h>

typedef int (* lpTestFun)();//定義一個與FunctionName函數接受參數類型和返回值均相同的函數指針類型

int main()

{

  HINSTANCE hDll;//句柄  

  lpTestFun theFun;//函數指針

  hDll=LoadLibrary("XXXX.dll");//動態加載DLL模塊句柄

  if(hDll)

  {

    theFun=(theFun) GetProcAddress(hDll,"FunctionName");//得到所加載DLL模塊中函數的地址,函數名可以使用VS6.0的Dll查看工具查看

    if(theFun)

    {

      theFun();

      printf("%d",result); } FreeLibrary(hDll);//釋放已經加載的DLL模塊

    }

    return 0;

}

 

有一點要注意,如果看到此類宏定義
#ifdef KSCANBAR_EXPORTS
#define KSCANBAR_API __declspec(dllexport)
#else
#define KSCANBAR_API __declspec(dllimport)
#endif
是因為

這樣定義一般出現在含有多個項目的解決方案中,這樣可以使從 DLL 導出更簡單的宏的標准方法。此 DLL 中的所有文件都是用命令行上定義的 KSCANBAR_EXPORTS符號編譯的。在使用此 DLL 的任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將KSCANBAR_API 函數視為是從 DLL 導入的,而此 DLL 則將用此宏定義的符號視為是被導出的。

參考 http://blog.csdn.net/crich_moon/article/details/6039939


免責聲明!

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



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