如何實現(xiàn)C++Builder調(diào)用DLL
嘗試著進行 C++Builder生成的 DLL 之前,回顧一下如何調(diào)用一個 C++Builder 創(chuàng)建的 DLL 可能會有給您的操作帶來很大幫助,你可以在運行時載入 DLL,而不是使用引入庫。
調(diào)用 DLL 函數(shù),首先通過選擇菜單 Project | Add to Project 的方法,把引入庫添加到你的 C++Builder 工程里;其次,在需要調(diào)用 DLL 函數(shù)的 C++ 源文件里為 DLL 頭文件插入 #include 聲明;***添加調(diào)用 DLL 函數(shù)的代碼。程序清單 A 和 B 包含了做為測試 DLL 的源代碼。注意,測試代碼實現(xiàn)了兩種不同的調(diào)用習(xí)慣(__stdcall 和 __cdecl)。
這樣幫是有充分的理由的。當(dāng)你設(shè)法調(diào)用一個用 Visual C++ 編譯的 DLL 時,大多讓你頭疼的事情都是由于處理不同的調(diào)用習(xí)慣產(chǎn)生的。還要注意一點,有一個函數(shù),它沒有明確列出使用的調(diào)用習(xí)慣。這個未知函數(shù)作為不列出調(diào)用習(xí)慣的 DLL 函數(shù)的標(biāo)識。
- #ifdef __cplusplus
- extern "C" {
- #endif
- #ifdef _BUILD_DLL_
- #define FUNCTION __declspec(dllexport)
- #else
- #define FUNCTION __declspec(dllimport)
- #endif
- FUNCTION int __stdcall StdCallFunction(int Value);
- FUNCTION int __cdecl CdeclFunction (int Value);
- FUNCTION int UnknownFunction(int Value);
- #ifdef __cplusplus
- }
- #endif
- //------------------------------------------
- //Listing B: DLL.C
- #define _BUILD_DLL_
- #include "dll.h"
- FUNCTION int __stdcall StdCallFunction(int Value)
- {
- return Value + 1;
- }
- FUNCTION int __cdecl CdeclFunction(int Value)
- {
- return Value + 2;
- }
- FUNCTION int UnknownFunction(int Value)
- {
- return Value;
- }
從清單 A 和 B 創(chuàng)建測試 DLL,打開 C++Builder,選擇菜單 File | New 調(diào)出 Object Repository。選擇 DLL 圖標(biāo),單擊 OK 按鈕。C++Builder 會創(chuàng)建一個新的工程,帶有一個源文件。這個文件包含一個 DLL 的入口函數(shù)和一些 include 聲明。現(xiàn)在選擇 File | New Unit。
保存新的單元為 DLL.CPP。從清單 A 拷貝粘貼文本插入頭文件 DLL.H。從清單 B 拷保存工程為 BCBDLL.BPR。接下來,編譯工程,看看生成的文件。C++Builder 生成了一個 DLL 和以 .LIB 為擴展名的引入庫。
這時,你有了在 C++Builder 里調(diào)用 DLL 所需的三個元素:DLL 本身,帶有函數(shù)原型的頭文件,用來連接的引入庫。現(xiàn)在我們需要一個用來調(diào)用 DLL 函數(shù)的 C++Builder 工程。在 C++Builder 里創(chuàng)建一個新的工程,保存到你的硬盤上。#t#
從 DLL 工程目錄里拷貝 DLL、引入庫、DLL.H 頭文件到新的目錄。其次,在主單元里添加 #include 聲明,包含 DLL.H。***,添加調(diào)用 DLL 函數(shù)的代碼。清單 C 列出了調(diào)用由清單 A 和 B 生成的 DLL 中每個函數(shù)的代碼。