国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用 C++ Builder 創建應用程序

2019-11-17 05:21:15
字體:
來源:轉載
供稿:網友
    3.1 創建應用程序
    C++Builder的主要用途于設計創建Windows應用程序。有三種基本的Windows應用程序:
· WindowsGUI應用程序。
· 控制面板應用程序。
· 服務應用程序。

    3.1.1 Windows應用程序
    當編譯一個工程時,將生成一個可執行文件(.EXE)。這個可執行文件通常提供程序的基本功能。
    簡單的程序通常只包含一個.EXE文件,可以在可執行文件中通過調用DLL、程序包和其他支持文件來擴充程序。
    Windows提供了兩種應用程序UI(用戶界面)模式:
· 單文檔界面(SDI)。
· 多文檔界面(MDI)。
    除了應用程序的實現模式,可以通過在IDE中設置工程選項來治理工程在設計時的行為和應用程序在運行時的行為。

    1.用戶界面模式
    對于所設計的任意窗體可以在應用程序中以多文檔界面(MDI)或單文檔界面(SDI)來實現。在一個MDI應用程序中,一個單個的父窗口可以打開多個文檔或子文檔,這種情況在表處理器和字處理器中十分常見。相對而言,一個SDI應用程序通常只包含單個文檔,為了將窗體設計成SDI應用程序,應將窗體對象的FormStyle屬性設置成fsNormal。
    關于開發應用程序UI的更多信息可參閱第4章。
    (1)SDI應用程序
    為了生成新的SDI應用程序:
    1)選擇FileNew,打開NewItems對話框。
    2)單擊PRoject頁面并選中SDIapplication
    3)單擊OK。
    缺省時,Form對象的FormStyle屬性被設置為fsNormal,所以C+Builder假設所有新的應用程序都是SDI應用程序。

    (2)MDI應用程序
    為了生成新的MDI應用程序:
    1)選擇FileNew,打開NewItems對話框。
    2)單擊Project頁面并選中MDIApplication。
    3)單擊OK。
    設計MDI應用程序需要更多的設計,比設計SDI應用程序更為復雜。MDI應用程序派生客戶端窗口中的子窗口,主窗體包含子窗體,通過設置TForm對象的FormStyle屬性,可定義一個窗體是子窗體(fsMDIForm),還是主窗體(fsMDIChild)。一個好的方法是,為子窗體定義一個基類,并從這個基類中派生出各個子窗體,從而避免重新設置子窗體的屬性。

    2.設置IDE、工程和編譯選項
    使用ProjectProjectOptions來定義工程的不同選項。要獲得更多的信息可參閱在線幫助。
    設置缺省的工程選項要改變應用于未來所有工程的缺省選項,可設置ProjectOptions對話框中的選項,選中窗口右下部的Default框,則所有新工程都會以目前的選項作為缺省值。

    3.1.2 程序設計模板
    程序設計模板通常用于程序的“框架”結構,可以在其中填加程序代碼。比如,若要在代碼中使用一個for循環,可以插入如下模板:

 for(;;)
 {
 }

    要在代碼編輯器中插入一程序代碼模板,可按下Ctrl-J,再選擇要用的模板。也可以將自己的模板加入這個集合。為了填加一個模板:
    1)選擇ToolsEnvironmentOptions。
    2)單擊CodeInsight標簽頁。
    3)在模板區域中單擊Add。
    4)選擇一個快捷鍵名稱并輸入對新模板的簡潔描述。
    5)在Code文本框中加入模板程序代碼。
    6)單擊OK。

    3.1.3 控制臺應用程序
    控制臺應用程序是32位Windows程序,它沒有圖形界面,通常在控制臺窗口中運行。這種應用程序一般不要求用戶太多的輸入,僅僅完成有限的功能。
    為了創建新的控制臺程序:
    1)選擇FileNew對話框中選擇ConsoleWizard(向導)。
    2)在ConsoleWizard對話框,選中ConsoleApplication選項,為工程的主模板選擇源程序類型(C或C++),或者指定一個包含了一個main或winmain函數的已存在的文件,然后單擊OK按鈕。
    ConsoleWizard將為這種類型的源程序文件創建一個工程文件。
    在控制臺應用程序中使用VCL當創建了一個新的控制臺應用程序時,IDE并不創建一個新的窗體,而只有代碼編輯器出現。可以在控制臺應用程序中使用VCL對象。為此,必須在ConsoleWizard中說明要使用VCL(選中UseVCL選項)。
    假如不這樣說明,將不能在程序中使用VCL。而強行使用將導致鏈接程序錯誤。

    3.1.4 服務應用程序
    服務應用程序接收客戶應用程序的請求,然后處理它們,并給客戶應用程序返回信息。一般來說,它們在幕后運行,不要太多的用戶輸入。Web、FTP或者E-MAIL(電子郵件)服務程序都是一個服務應用程序的例子。
    為了創建實現Win32服務的應用程序,選擇FileNew,并從NewItems頁面中選擇ServiceApplication,這將在工程中加入一個類型為TServiceApplication的全局變量Application。一旦創建了服務應用程序,在設計欄中會看見一個對應服務(TService)的窗口,通過在Object Inspector(對象觀察器)中設置其屬性和事件處理程序就可實現該服務;也可以在NewItems對話框中選擇Service為服務應用程序增加其他的服務,不要將服務加入非服務應用程序中。否則,雖然可以加入一個TService對象,但應用程序不能生成必要的事件,也不能將該服務作適當的Windows函數調用。
    一旦建立了服務應用程序,就能用ServiceControlManager(SCM)安裝它的各項服務,其他應用程序可以向SCM發送請求,啟動這些服務。
    為了安裝應用程序的服務,可以使用/INSTALL選項來運行它,應用程序安裝完服務后退出,假如安裝成功將給出一個確認消息,可以使用/SILENT選項運行服務應用程序來抑制確認信息。
    若要卸載服務,可使用/UNINSTALL選項運行命令(也可以在卸載時用/SILENT選項來抑制確認信息)。

    范例:這個服務具有端口號為80的TServerSocket。這是Web瀏覽器向Web服務器請求服務和Web服務器響應Web瀏覽器的缺省端口號,這個特例會在C:/Temp目錄下生成名為WebLogxxx.log的文本文檔(其中xxx是ThreadID號)。任意給定端口只應被一個服務器監聽,因此,假如具有Web服務器,必須確定它沒有進行監聽(該服務被停止了)。
    為了看到結果,可打開一個本地的Web瀏覽器,在地址欄中輸入LocalHost,瀏覽器最終會超時,但在C:/Temp目錄下會得到一個名為WebLogxxx.Log的文件。
    1)為了創建這個例子,選擇FileNew,在NewItems對話框中選擇ServiceApplication,可以看見名為Service1的窗口,在組件面板的Internet頁中,把一個ServerSocket組件加入到服務窗口(Service1)。
    2)第2步,把一個TMemoryStream類型的私有數據成員添加到TService1類中,程序單元的頭文件如下:
使用 C++ Builder 創建應用程序(圖一)

    3)接著選擇在第1步中加入的ServerSocket1組件。在對象觀察器的Events頁面中,雙擊OnClientRead事件,添加以下事件處理程序:
使用 C++ Builder 創建應用程序(圖二)


    4)最后,單擊窗口的客戶區(但不是ServiceSocket)選擇Service1。在對象觀察器中,雙擊OnExecute事件,添加以下事件處理程序。
使用 C++ Builder 創建應用程序(圖三)

    編寫服務器應用程序時,應當知道:
· 服務線程。
· 服務名屬性。
· 調試服務。
    1.服務線程
    每個服務都有自己的線程(TServiceThread),因此,假如服務應用程序實現多個服務,則必須確定服務實例是安全的線程(thread_safe)。TServiceThread被設計成可以使用TService的OnExecute事件處理程序實現服務,服務線程有自己的Execute方法,它包含一個能在處理新請求之前調用服務的OnStart和OnExecute處理程序的循環。
    因為服務請求可能會花很長時間進行處理,服務應用程序也可能同時收到多個用戶的類似請求,較有效的方法是對每個請求產生新線程(從TThread而不是TServiceThread中派生),并將服務實例移到新線程的Execute方法中。這將答應服務線程的Execute循環連續地處理新請求且不用等待服務的OnExecute處理程序結束。下面是一個例子。
    范例:這個服務會在標準的線程中每隔500μs便發出聲響,當服務被告之要暫停、繼續或停止時,它會處理線程的暫停、繼續或停止。
    1)選擇FileNew,在NewItems對話框中選擇ServiceApplication,將打開一個名為Service1的窗口。
    2)在程序單元的頭文件中,聲明一個名為TSparkyThread的TThread的新后代,它是為服務工作的線程,聲明如下:
使用 C++ Builder 創建應用程序(圖四)

    3)下一步,在程序單元的.cpp的文件中,為TSparkyThread實例創建全局變量。
 TSparkThread *Sparkythread;

    4)把以下代碼加入到.cpp文件中的TSparkyThread構造函數中。
使用 C++ Builder 創建應用程序(圖五)

    5)在.cpp文件的TSparkyThreadExecute方法(線程函數)中加入以下代碼:
使用 C++ Builder 創建應用程序(圖六)

    6)選擇Service窗口(Service1),在對象觀察器中雙擊OnStart事件,在OnStart事件處理程序中加入以下代碼:
使用 C++ Builder 創建應用程序(圖七)

    7)在對象觀察器中雙擊OnContinue事件,在OnContinue事件處理程序中加入以下代碼。
使用 C++ Builder 創建應用程序(圖八)

    8)在對象觀察器中,雙擊OnPause事件,在OnPause事件處理程序中添加以下代碼:
使用 C++ Builder 創建應用程序(圖九)

    9)最后,雙擊對象觀察器中的OnStop事件,在OnStop事件處理程序中添加以下代碼:
使用 C++ Builder 創建應用程序(圖十)

    在開發服務應用程序時,應根據所提供服務的性質、連接的預期數目以及期望運行服務的處理器數派生新線程。

    2.服務名屬性
    VCL提供了創建服務應用程序的類,包括TService和TDependency,使用這些類時,不同的名稱屬性易使人感到混淆,本節描述了它們之間的區別。
    具有與口令關聯的用戶名(稱之為Service啟動名)的服務,在治理器和編輯窗口顯示名稱和真名稱(該服務的名字)。Dependency 可以是服務或者按分組順序裝載,它們也有名字和顯示名。因為服務對象是從TComponent派生,所以它們繼續了Name屬性,下面兩節概要介紹這些名稱屬性。
    (1)TDependency屬性
    TDependency的DisplayName既是服務的顯示名又是真實名,它幾乎總是和TDependency的Name屬性相同。

    (2)TService名稱屬性
    TService的Name屬性從TComponent中派生,它是組件名,也是服務名,對于作為服務的Dependency,這個屬性與TDependency的Name和DisplayName屬性相同。
    TService的DisplayName是顯示在服務治理器(ServiceManager)窗口中的名字,它通常和真實服務名不同(TService::Name、TDependency::DisplayName、TDependency::Name),注重通常Dependency的DisplayName和Service的DisplayName不同。
    服務啟動名與服務顯示名、真實服務名是不一樣的,ServiceStartName是在服務控制治理器中選擇Start對話框輸入的用戶名。

    3.調試服務
    調試服務應用程序有一些技巧,因為它需要一些短的間隔時間。
    1)首先,在調試器中,啟動應用程序,等待數秒直至裝入完成。
    2)從控制面板或命令行快速啟動服務。
    必須快速啟動服務(應用程序啟動在15~30s內),因為假如沒有服務被啟動,則程序會終止。
    當應用程序運行時,附加服務應用程序也是一種方法(也就是說,先啟動服務,再附加調試器)。為了與服務應用程序進程連上,可選擇RunAttachToProcess,并在結果對話框中選擇服務應用程序,在某些情況下,因為沒有充分的權限,會使第二種方法失敗。假如是這樣,可以使用服務控制治理器來激活調試器的調試服務。

    1)首先,在下列注冊項中創建名為ImageFileExecutionOptions的要害字。
 HKEY_LOCAL_MACHINE/SIFTWARE/Microsoft/Windows NT/CurrentVersion
    2)創建與服務(如:MYSERV.EXE)同名的子要害字。在這個子要害字中加入類型為REG_SZ的值,命名為Debugger。使用到BCB.exe的完整路經名作為字符串的串值。
    3)在服務控制面板的應用程序中選擇服務,單擊Startup并選中AllowService為Interactwith Desktop。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中超| 望奎县| 德江县| 河北区| 浑源县| 兴文县| 汝阳县| 容城县| 敦化市| 山东| 陵川县| 保靖县| 黔西县| 烟台市| 修武县| 安远县| 理塘县| 博湖县| 临夏县| 洛隆县| 高碑店市| 怀化市| 呼图壁县| 山东| 樟树市| 枝江市| 拜城县| 江津市| 隆尧县| 孝义市| 如东县| 梓潼县| 县级市| 南华县| 仁怀市| 定陶县| 镇坪县| 安丘市| 都匀市| 白玉县| 扶沟县|