本文章結合一個讀AutoCAD字體文件的實例說明使用C++開發程序的一些經驗,本例中,進行讀取AutoCAD字體文件,將其字體輪廓讀入自定義結構中,顯示在屏幕上
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
圖一:工程運行結果
1:工程的搭建
一般的中小型程序,採用幾個DLL加一個主程序的方式組織起來,將不同的子模塊放在不同的工程裏,DLL的動態連接不是將庫代碼拷貝,而是在程序中記錄函數的入口點和接口,在程序執行時纔將庫代碼裝入內存。如果有多個程序使用相同的DLL,也只需將DLL在內存中裝載一次,以節省內存的開銷。另外對於一個大型的、不斷更新的應用程序,可將許多重複的功能編寫成DLL,用主程序調用,這樣既能減少開發的工作量,又能提高訪問速度。
本例中,將程序分爲處理AutoCAD字體文件模塊(ReadShx工程)和主程序模塊(Shape工程),其中Shape工程僅僅添加幾行代碼,實現對ReadShx工程的應用,目錄結構如下:
圖二:工程目錄結構
下面詳細介紹該工程的實現方法
1:建立ReadShx目錄,本程序的所有代碼、編譯出的二進制文件、以及所用到的AutoCAD的字體文件都在該目錄及其子目錄下。
2:用VC在ReadShx建立基於MFC AppWizard(EXE)的Shape工程,工程採用SDI(單文檔)組織形式,在程序的最後一步將CShapeView從CScrollView派生,基於CscrollView派生的View類的好處是可以方便地爲窗口添加滾動條。
3:建立基於Win32 Dynamic-Link Liberary的ReadShx工程,選擇Add to current Workspace,選中Dependency of複選框。確定後選擇A DLL that exports Some Symbols。點擊完成。將Shape工程設置爲活動工程。
選擇基於Win32而不是MFC的DLL是考慮到代碼今後應用在其他場合的兼容性,這樣的話,不能使用MFC中提供的類,只能使用WIN32API函數,好處是代碼可以在其他不能用MFC的場合應用,我覺得使用DLL的最大方便之處就在於代碼複用性好、模塊化清晰,使用MFC無疑爲程序的移植性平添許多障礙。
4:刪除ReadShx.cpp中的其他類和函數、變量只保留DllMain函數,在工程中刪除ReadShx.h文件
5:在ReadShx工程的ClassView中選擇new class…,建立新類CShapeInfo,這個類是要跨越工程應用的,所以將它的頭文件ShapeInfo.h放入公共頭文件目錄inc中(如圖二)
6:記得在第四步中工程裏刪掉的ReadShx.h文件吧?打開它,將如下語句複製到ShapeInfo.h中:
#ifdef READSHX_EXPORTS
#define READSHX_API __declspec(dllexport)
#else
#define READSHX_API __declspec(dllimport)
#endif
在CShapeIndex類的聲明中添加READSHX_API導出類:
class READSHX_API CShapeIndex
{
public:
CShapeIndex();
virtual ~CShapeIndex();
};
其中READSHX_EXPORTS是在Alt+F7中ReadShx工程C/C++選項卡中Preprocessor definition 中定義的預定義宏,因此本工程中已經定義了這個宏,而在其他工程中這個宏不會定義,所以在本工程中,READSHX_API定義爲__declspec(dllexport)將類、函數或者變量導出,其他的工程中READSHX_API定義爲__declspec(dllimport)將類、函數或者變量導入,完成類、函數、變量的跨工程使用
Alt+F7打開工程設置,將兩個工程的General中的Output Files的目錄改爲../Debug,選擇Win32 Release,將該目錄改爲../Release,選擇Shape工程,在Link選項卡的Object/Library modules中添加ReadShx.lib,以使用當前ReadShx.dll工程
最後一個任務,在Tools的Options菜單彈出的對話框中的Directories的Library files中添加ReadShx/Debug(Release中添加ReadShx/Release)的路徑,注意ReadShx是指最上一級而不是ReadShx工程的目錄。
現在就能在主工程中使用CShapeIndex類創建對象了,在主工程的Shape.h中添加語句:
#include "../inc/shapeinfo.h"
CShapeApp類中添加public:成員變量:
CShapeInfo m_ShapeInfo;
重新編譯整個工程,應該沒有錯誤提示。至此:工程環境搭建完成。