GacUI終于進(jìn)入制作dll的階段了。昨天上傳了一個新的工程,在
Vczh Library++3.0(E:\Codeplex\vlpp\Workspace\Tools\Release\SideProjects\GacUI\GacUI.sln)。這里面一共有三個工程,有兩個是工具,一個是dll。
為了編譯出帶反射的控件庫,因此每一個控件都可以獲得一個ITypeDescriptor對象。但是控件庫一共有幾十個類上千個函數(shù),我不可能一個一個去實(shí)現(xiàn)的(請想想實(shí)現(xiàn)IDispatcher的時候)。根據(jù)
上一篇博客討論過技術(shù),我將使用一個程序來讀pdb生成C++代碼。詳細(xì)的計劃如下:
1:制作一個_GacPDB工程。這是一個exe,但是是沒用的,唯一的用處就是他引用了GacUI.dll所需要的所有源代碼,然后靠編譯器產(chǎn)生PDB文件。
2:制作一個_TranslatePDBtoXML工程。這是一個exe,從PDB抽取類聲明。
3:制作一個_TranslateXMltoCode。顧名思義,不過現(xiàn)在還沒做,原理是一樣的。
4:GacUI.dll。這個dll包含了所有的控件的實(shí)現(xiàn),還有_TranslateXMLtoCode產(chǎn)生的所有代碼。
現(xiàn)在我的目標(biāo)是,先編譯_Translate*工程,然后編譯_GacPDB產(chǎn)生pdb后自動調(diào)用它們,生成代碼結(jié)束之后開始合并編譯GacUI.dll。所有的這些東西都需要在VisualStudio的“Rebuild Solution”里面完成。為了完成這個目標(biāo),我創(chuàng)建這些工程之后,按照下面的方法修改了工程屬性:
1 _TranslatePDBtoXML:
2 post build action:
3 copy $(ProjectDir)msdia100.dll $(SolutionDir)$(Configuration)\msdia100.dll
4 _GenPDB:
5 references:
6 _TranslatePDBtoXML
7 post build action:
8 $(SolutionDir)$(Configuration)\_TranslatePDBtoXML.exe $(SolutionDir)Debug\_GenPDB.pdb $(SolutionDir)_GenPDB.xml
9 GacUI:
10 references:
11 _GenPDB
1:工程A引用了工程B的話,那么只有當(dāng)B完全編譯好之后才會編譯A。因此上面的配置將阻止三個工程平行編譯,強(qiáng)制他們按照_TranslatePDBtoXML、_GenPDB和GacUI的順序來。
2:_TranslatePDBtoXML編譯好之后,會把它依賴的msdia100.dll復(fù)制到編譯出來的exe旁邊,以供接下來調(diào)用。
3:_GenPDB編譯好之后,pdb已經(jīng)產(chǎn)生了。這個時候它會自動調(diào)用上一步編譯出來的_TranslatePDBtoXML,讀取pdb,輸出xml
4:(接下來要做的)調(diào)用_TranslateXMLtoCode,輸入xml,輸出C++代碼
5:這個時候,生成的C++代碼已經(jīng)就緒了,所以開始編譯GacUI。
附加的好處還有一個。因?yàn)開GenPDB引用了GacUI的cpp,所以當(dāng)GacUI的源代碼修改的時候,_GenPDB也會感應(yīng)到,從而在下次編譯GacUI的時候先開始編譯_GenPDB。并且因?yàn)镚acUI依賴了_GenPDB,所以_GenPDB仍然會先編譯。而且這種依賴關(guān)系是無害的,因?yàn)開GenPDB沒有輸出lib,因此GacUI.dll在運(yùn)行的時候完全不需要_GenPDB.exe的存在。
好了。那把一個個的cpp文件添加到_GenPDB也是在太麻煩了,所以我投機(jī)取巧了一下:
1 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiApplication.cpp"
2 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiBasicControls.cpp"
3 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiListControls.cpp"
4 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiTextControls.cpp"
5 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiWindowControls.cpp"
6 //---------------------------------------------------------------
7 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiComboControls.cpp"
8 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiContainerControls.cpp"
9 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiListViewControls.cpp"
10 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiMenuControls.cpp"
11 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiTextListControls.cpp"
12 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiTreeViewControls.cpp"
13 //---------------------------------------------------------------
14 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\Styles\GuiCommonStyles.cpp"
15 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\Styles\GuiWin7Styles.cpp"
16 //---------------------------------------------------------------
17 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsComposition.cpp"
18 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsElement.cpp"
19 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsEventReceiver.cpp"
20 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsHost.cpp"
21 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsTextElement.cpp"
22 //---------------------------------------------------------------
23 #include "..\..\..\..\..\Candidate\GUI\GUI\NativeWindow\GuiNativeWindow.cpp"
24 #include "..\..\..\..\..\Candidate\GUI\GUI\NativeWindow\Windows\WinNativeWindow.cpp"
25 //---------------------------------------------------------------
26 #include "..\..\..\..\..\Candidate\GUI\GUI\Reflection\GuiTypeDescriptor.cpp"
27 //---------------------------------------------------------------
28 #include "..\..\..\..\..\Library\Basic.cpp"
29 #include "..\..\..\..\..\Library\Exception.cpp"
30 #include "..\..\..\..\..\Library\String.cpp"
31 #include "..\..\..\..\..\Library\Threading.cpp"
32 #include "..\..\..\..\..\Library\Collections\Operation.cpp"
33 //---------------------------------------------------------------
34 #include <Windows.h>
35
36 int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
37 {
38 return 0;
39 }
VisualStudio的功能是強(qiáng)大的。只要善于使用,或者配合MSBuild,所起到的威力將毫不亞于某些著名工具鏈。而且VisualStudio編譯器產(chǎn)生的文件,基本上VisualStudio都有提供API供你閱讀,所以也可以做很多事情,譬如我這篇文章說的這樣,充當(dāng)了一個編譯器的擴(kuò)展,而且完美集成。
posted on 2012-01-13 22:09
陳梓瀚(vczh) 閱讀(7400)
評論(7) 編輯 收藏 引用 所屬分類:
C++實(shí)用技巧 、
GacUI