一.此篇文章的目的為何??
示範如何由 VC 產生一個 Win32 Static Library 及一個 Win32 Dynamic Link Library,
並分別由 BCB 引用二.此篇文章的主題為何??
共分為四大部分,以下將分別針對這四大部分做介紹
===================================================================
1.利用 VC 產生一個 Win32 Static Library (LIB)
1.1.開啟 VC 選擇「File/New」開啟「New」Dialog
1.2.在左邊「Projects」Tab 中選擇「Win32 Static Library」
1.3.在右邊「Project name」欄位填好名稱 (例如: VCLib)
1.4.在右邊「Location」欄位選擇專案要存放的目錄
1.5.然後按「OK」Button,開啟「Win32 Static Library-Step 1 of 1」 Dialog,
確認「Pre-Compiled header」及「MFC support」不要打勾
1.6.然後按「Finish」Button
1.7.在 VC 的 IDE 環境之中,你會發現這個 LIB 專案還是空的,
因此我們要先為這個專案新增 *.h 及 *.cpp
1.8.選擇「File/New」開啟「New」Dialog
1.9.在左邊「Files」Tab 中選擇「C/C++ Header File」
1.10.在右邊確認「Add to project」有打勾,並在「File」欄位輸入檔案名稱 (例如: VCLib.h),
最後按「OK」Button
1.11.在 VC 的 IDE 環境之中,你會發現這個 LIB 專案已經新增了一個檔案 VCLib.h
(在左邊的「FileView」Tab 中的樹狀結構中的「Header Files」
子目錄裡面可以看得到)
1.12.選擇「File/New」開啟「New」Dialog
1.13.在左邊「Files」Tab 中選擇「C++ Source File」
1.14.在右邊確認「Add to project」有打勾,並在「File」欄位輸入檔案名稱
(例如: VCLib.cpp), 最後按「OK」Button
1.15.在 VC 的 IDE 環境之中,你會發現這個 LIB 專案已經新增了一個檔案 VCLib.cpp
(在左邊的「FileView」Tab 中的樹狀結構中的「Source Files」
子目錄裡面可以看得到)
1.16.接著在 VCLib.h 檔案裡面加入以下的程式碼
#ifndef __VCLIB_H__
#define __VCLIB_H__
int AddMethod(int a, int b);
#endif // __VCLIB_H__
1.17.接著在 VCLib.cpp 檔案裡面加入以下的程式碼
#include "VCLib.h"
int AddMethod(int a, int b)
{
return(a+b);
}
1.18.選擇「Build/Rebuild All」就會開始編譯此 LIB 專案直至完成
1.19.若編譯無誤的話,用檔案總管檢視你儲存的專案目錄下,有可能會產生一個「Debug」
子目錄,也有可能產生一個「Release」子目錄,這跟此 LIB 專案的設定有關
(可從「Project/Settings」中去設定要編譯成「Debug」或「Release」版本,
預設值為「Debug」),在此建議先編譯成「Release」版本,
因此會在「Release」子目錄下找到這個 LIB 專案主要的成品檔案「VCLib.lib」
1.20.選擇「File/Close Workspace」關閉此 LIB 專案
====================================================================
2.利用 VC 及 1. 中的 LIB 產生一個 Win32 Dynamic Link Library (DLL)
2.1.開啟 VC 選擇「File/New」開啟「New」Dialog
2.2.在左邊「Projects」Tab 中選擇「Win32 Dynamic-Link Library」
2.3.在右邊「Project name」欄位填好名稱 (例如: VCDll)
2.4.在右邊「Location」欄位選擇專案要存放的目錄
2.5.然後按「OK」Button,開啟「Win32 Dynamic-Lin Library - Step 1 of 1」Dialog,
選擇「A DLL that exports some symbols」(選擇這個的原因,是因為可以偷懶)
2.6.然後按「Finish」Button
2.7.在 VC 的 IDE 環境之中,你會發現這個 DLL 專案已經自動新增了五個檔案
stdAfx.cpp, VCDll.cpp, stdAfx.h, VCDll.h, ReadMe.txt(在左邊的「FileView」
Tab 中的樹狀結構中的「Source Files」及「Header Files」子目錄裡面可以看得到)
2.8.在 VC 的 IDE 環境之中,在左邊的「FileView」
Tab 中選擇「VCDll files」按滑鼠右鍵,
選擇「Add Files to Project」開啟「Insert Files into Project」Dialog,
選擇「檔案類型」為「Library Files (.lib)」,
「檔案名稱」選擇剛剛 1. 中的成品「VCLib.lib」
2.9.如果加入成功的話,在 VC 的 IDE 環境之中,左邊的「FileView」
樹狀結構中可以看得到剛剛加入的檔案「VCLib.lib」
2.10.更改檔案 VCDll.h 的內容如下
#ifndef __VCDLL_H__
#define __VCDLL_H__
#define VCDLL_API __declspec(dllexport)
extern "C" {
VCDLL_API int AddMethodEx(int a, int b);
}
#endif // __VCDLL_H__
2.11.更改檔案 VCDll.cpp 的內容如下
#include "stdafx.h"
#include "VCDll.h"
#include "..\VCLib\VCLib.h"
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int AddMethodEx(int a, int b)
{
return(AddMethod(a, b));
}
2.12.選擇「Build/Rebuild All」就會開始編譯此 DLL 專案直至完成
2.13.若編譯無誤的話,用檔案總管檢視你儲存的專案目錄下,
有可能會產生一個「Debug」子目錄,也有可能產生一個「Release」子目錄,
這跟此 DLL 專案的設定有關 (可從「Project/Settings」中
去設定要編譯成「Debug」或「Release」版本,預設值為「Debug」),
在此建議先編譯成「Release」版本,因此會在「Release」子目錄下找到
這個 DLL 專案主要的成品檔案「VCDll.dll」
2.14.選擇「File/Close Workspace」關閉此 DLL 專案
3.利用 BCB 引用 2. 中的 DLL (靜態連結)
3.1.開啟 BCB 並新增一個 Application 專案
3.2.選擇「File/Save Project As」將此專案更名為「BCBSta」,
並將檔案儲存到自定的目錄之下
3.3.將 VCDll.dll 及 VCDll.h 兩個檔案,複製到 BCBSta 專案的目錄下,
並另外開啟一個 DOS BOX (Command Line),在 BCBSta 專案的目錄 下鍵入指令
「implib -a VCDll.lib VCDll.dll」,如果成功的話,
會在 BCBSta 目錄下產生一個新的檔案「VCDll.lib」
3.4.在 BCB 的 IDE 中選擇「View/Project Manager」開啟「Project Manager」Dialog,
把剛剛產生的檔案「VCDll.lib」加入此 BCBSta 專案
3.5.在 Form1 上拉一個 Button1,然後在 Unit1.cpp 中加入以下的程式碼
#include "VCDll.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage(IntToStr(AddMethodEx(1, 1)));
}
3.6.執行 BCBSta 專案看看是否成功??
3.7.關閉 BCB
4.利用 BCB 引用 2. 中的 DLL (動態連結)
4.1.開啟 BCB 並新增一個 Application 專案
4.2.選擇「File/Save Project As」將此專案更名為「BCBDyn」,
並將檔 安儲存到自定的目錄之下
4.3.將 VCDll.dll 檔案複製到 BCBDyn 專案的目錄下
4.4.在 Form1 上拉一個 Button1,然後在 Unit1.cpp 中加入以下的程式碼
typedef int (*ADDMETHODEX)(int, int);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE dll=NULL;
ADDMETHODEX AddMethodEx=NULL;
dll=LoadLibrary("VCDll.dll");
if(dll!=NULL)
{
AddMethodEx=(ADDMETHODEX)GetProcAddress(dll, "AddMethodEx");
if(AddMethodEx!=NULL)
{
ShowMessage(IntToStr(AddMethodEx(1, 1)));
}
FreeLibrary(dll);
}
}
4.5.執行 BCBDyn 專案看看是否成功??
4.6.關閉 BCB三.有完整的範例程式碼可以下載嗎??
http://delphi.ktop.com.tw/loadfile.php?TOPICID=10460160&CC=233940
四.範例程式該如何使用呢?? 下載並解壓縮檔案 VCBCB1.zip 以後,會產生 VCBCB1 目錄,
在此目錄之下又有四個子目錄,
這四個子目錄分別對應到
二. 中所敘述的四個部分五.如果寫得不好,或是有不對的地方,請大家多多指教