使用VC開發程序經驗談(一)

       本文章結合一個讀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:用VCReadShx建立基於MFC AppWizard(EXE)Shape工程,工程採用SDI(單文檔)組織形式,在程序的最後一步將CShapeViewCScrollView派生,基於CscrollView派生的View類的好處是可以方便地爲窗口添加滾動條。

3:建立基於Win32 Dynamic-Link LiberaryReadShx工程,選擇Add to current Workspace,選中Dependency of複選框。確定後選擇A DLL that exports Some Symbols。點擊完成。將Shape工程設置爲活動工程。

選擇基於Win32而不是MFCDLL是考慮到代碼今後應用在其他場合的兼容性,這樣的話,不能使用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+F7ReadShx工程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工程

       最後一個任務,在ToolsOptions菜單彈出的對話框中的DirectoriesLibrary files中添加ReadShx/Debug(Release中添加ReadShx/Release)的路徑,注意ReadShx是指最上一級而不是ReadShx工程的目錄。

       現在就能在主工程中使用CShapeIndex類創建對象了,在主工程的Shape.h中添加語句:

#include "../inc/shapeinfo.h"

       CShapeApp類中添加public:成員變量:

         CShapeInfo m_ShapeInfo;

       重新編譯整個工程,應該沒有錯誤提示。至此:工程環境搭建完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章