程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> VC++ 6.0如何創建與調用動態鏈接庫

VC++ 6.0如何創建與調用動態鏈接庫

編輯:更多關於編程

      1.靜態鏈接庫與動態鏈接庫區別:

      靜態鏈接庫:lib中的指令被直接包含在最終生成的EXE文件中。

      動態鏈接庫:dll不必被包含在最終的EXE中,EXE文件執行時可以動態地引用和卸載DLL文件。

      同時,靜態鏈接庫中不能再包含其他的動態鏈接庫或靜態庫,而動態鏈接庫中可以包含其他的動態或靜態庫。

      2.VC++支持的DLL:

      DLL的編制與具體的編程語言及編譯器無關,動態鏈接庫隨處可見,VC++支持三種DLL:非MFC動態庫、MFC規則DLL和MFC擴展DLL。DLL導出函數(或變量、類)可供應用程序調用;DLL內部函數只能在DLL程序內使用,應用程序無法調用它們。

      3.導出函數的聲明方式:

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

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

      LIBRARY 庫工程名稱

      EXPORTS 導出函數名

      4.DLL的調用方式:

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

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

      5.所有庫工程編譯時必須Release方式:

      Build—set active configuration—選擇庫工程的release方式

      6.示例:

      一、 函數----創建動態鏈接庫(MFC規則DLL)

      1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名為MFC_dll

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

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

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

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

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

      {

      return a+b;

      }

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

      6. 生成

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

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

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

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

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

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

      extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//聲明導入函數

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

      #include "test.h"

      int main()

      {

      cout<

      return 0;

      }

      //動態調用

      #include

      #include

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

      int main()

      {

      HINSTANCE hDll;//句柄

      lpAddFun addFun;//函數指針

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

      if(hDll)

      {

      addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所加載DLL模塊中函數的地址

      if(addFun)

      {

      int result=addFun(2,3);

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

      }

      return 0;

      }

      三、 變量----創建動態鏈接庫(非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

      int dllGlobalVar;

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

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

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