青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

笑看風(fēng)云淡

寵辱不驚,看庭前花開花落;去留無意,望天空云卷云舒
posts - 96, comments - 48, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

第一章 不能免俗的“Hello, World!”

在這一章里,就像所有的入門級教程一樣,我也將不能免俗地以一個(gè)“Hello, World!”程序開始我的教程。然后,我將逐步深入,向你介紹這個(gè)ATL版本程序中所有必要的信息。此外,我還將介紹一些Win32中你可能不知道的東西,包括WinMain的_t兼容以及如何在MessageBox中加入自己的圖標(biāo)等等。

接近,接近,再接近……

可以說,所有“Hello, World!”程序的內(nèi)容不外乎都是以十分有限的幾行代碼向當(dāng)前的目標(biāo)屏幕環(huán)境上輸出一個(gè)字符串“Hello, World!”。這個(gè)程序通常具有以下幾個(gè)特點(diǎn):

  1. 排除印刷錯(cuò)誤的可能性,幾乎所有的初學(xué)者都可以照葫蘆畫瓢地獨(dú)立書寫、編譯并運(yùn)行這個(gè)程序。
  2. 這個(gè)程序可以體現(xiàn)出當(dāng)前語言環(huán)境的典型配置方式。
  3. 這個(gè)程序中具有當(dāng)前語言特定的程序入口點(diǎn)。
  4. 這個(gè)程序中含有一條當(dāng)前環(huán)境典型的輸出語句(通常也是最簡單、最常用的),由這條語句來輸出“Hello, World!”字符串。
  5. 從這個(gè)程序可以很清楚的了解當(dāng)前語言環(huán)境下程序運(yùn)行的典型流程。
  6. 這個(gè)程序可能還會(huì)表現(xiàn)當(dāng)前語言的一些其它特點(diǎn)。

那么,首先讓我以最簡單的C語言版“Hello, World!”開始吧:

#include <stdio.h>

int main()
{
    printf( "Hello, World!n" );
    return 0;
}

雖然是不到10行的代碼,但它仍然五臟俱全。現(xiàn)在,就由我將它和上述的特點(diǎn)對號入座吧。也就是說,這個(gè)程序能體現(xiàn)出C程序設(shè)計(jì)的以下特點(diǎn):

  1. C語言的程序以main函數(shù)作為程序入口點(diǎn)。
  2. printf是C中用來輸出字符串的代碼。
  3. 函數(shù)是C語言程序的基本單位,它通常由返回值、函數(shù)名、參數(shù)列表、函數(shù)體、return組成。
  4. 調(diào)用函數(shù)的時(shí)候要include相應(yīng)的頭文件。
  5. n是C語言中的轉(zhuǎn)義字符,代表換行符。

接下來,我們來看一看Win32版的“Hello, World!”:

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    MessageBox( NULL, TEXT("Hello, World!"), TEXT("Hello"), 0 );
    return 0;
}

這個(gè)程序告訴你了以下幾件事:

  1. 所有Win32下的C程序都需要包含windows.h頭文件。
  2. Win32下的程序是以WinMain作為程序入口點(diǎn)的,而不是main。
  3. Win32下最常用輸出信息的方法是MessageBox。
  4. WINAPI是Win32 API函數(shù)的調(diào)用約定,也就是__stdcall。
  5. HINSTANCE、LPSTR都是Win32自定義的數(shù)據(jù)類型,分別表示應(yīng)用程序?qū)嵗浔鸵钥兆址Y(jié)尾的ANSI字符串指針。
  6. TEXT宏用于在源代碼一級保證ANSI/Unicode字符串的兼容。

如果你對以上的幾個(gè)知識(shí)點(diǎn)仍然有些許迷茫,請參考Charles Petzold的《Programming Windows》(中譯《Windows程序設(shè)計(jì)》)的第一章。這段代碼就是幾乎原封不動(dòng)地搬過來的。不過,我在編寫這段代碼的時(shí)候,通常會(huì)這么寫:

#include <windows.h>
#include <tchar.h>

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    MessageBox( NULL, _T("Hello, World!"), _T("Hello"), 0 );
    return 0;
}

是的,有幾個(gè)地方有些不一樣,我對它們的解釋是:

  1. tchar.h中包含了對C runtime library中ANSI/Unicode字符串的源代碼級兼容。
  2. _tWinMain提供了對命令行參數(shù)lpCmdLine的ANSI/Unicode源碼級兼容。
  3. _T宏亦包含在tchar.h之中,它的作用和TEXT宏一樣,但它比TEXT宏更加短小,因此可以節(jié)省編碼的時(shí)間。

現(xiàn)在我可以告訴你,隨著我們的步步接近,接下來ATL版的“Hello, World!”程序就要出現(xiàn)在我們的眼前了。那么,就讓我們來看看這個(gè)猶抱琵琶半遮面的家伙吧。(請注意,雖然這是一個(gè)ATL版本的程序,但是你仍然需要建立一個(gè)Win32 Application的工程,而不是用ATL/COM Wizard。)

//////////////////////////////////////////////////////////////////////////
// ATL的GUI程序設(shè)計(jì)配套源代碼
// 第一章 不能免俗的“Hello, World!”
// 工程名稱:HelloWorld
// 作者:李馬
// http://www.titilima.cn
//////////////////////////////////////////////////////////////////////////

#include <atlbase.h>
CComModule _Module;

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    _Module.Init( NULL, hInstance );
    MessageBox( NULL, _T("Hello, World!"), _T("Hello"), 0 );
    _Module.Term();
    return 0;
}

也許有些陌生了,不過所幸它并無太多的變化——畢竟整個(gè)代碼段就沒有多長。好了,這一節(jié)的內(nèi)容就到這里,希望李馬的這種漸近的方法沒讓大家覺得一切來得太突然。大家可以喝口水先,然后做個(gè)深呼吸再,因?yàn)榻酉聛砦覀兙鸵_始接觸真正的ATL程序了。

“不過如此”

說句題外話先。許是我太狂妄,又許是我太幼稚,總之我在上大學(xué)以來,越來越喜歡說“不過如此”這句話。譬如上了大學(xué)以后,沒過倆月我就覺得大學(xué)“不過如此”;學(xué)會(huì)喝酒之后,就又會(huì)覺得喝酒“不過如此”;到了北京以后,又覺得北京“不過如此”;參觀了某著名軟件公司之后,又覺得它“不過如此”……書歸正傳話歸正題,不知道你第一眼看過ATL版本的“Hello, World!”之后會(huì)不會(huì)同樣有這樣一種感覺?——自然,我希望是這樣的。

那么,在了解ATL之前,就讓我們先來目測一下這個(gè)“Hello, World!”吧。也許,你會(huì)從上面的代碼猜到以下內(nèi)容:

  1. atlbase.h大概其應(yīng)該是ATL程序需要包含的頭文件。
  2. CComModule,從類名稱看應(yīng)該是一個(gè)模塊類。_Module是這個(gè)模塊類的實(shí)例。
  3. WinMain沒變。
  4. CComModule::Init應(yīng)該是對模塊進(jìn)行初始化,這個(gè)方法應(yīng)該是在程序初始化的時(shí)候調(diào)用。
  5. CComModule::Term應(yīng)該是對模塊進(jìn)行結(jié)束處理,這個(gè)方法應(yīng)該是在程序結(jié)束之前調(diào)用。
  6. WinMain的最后仍然是以return結(jié)尾。

好,是不是“不過如此”呢?沒錯(cuò)!

大抵如此

到此為止,希望你的猜想能夠讓你對ATL的恐懼感(如果有的話)一掃而光。那么,現(xiàn)在李馬來為你補(bǔ)充上幾點(diǎn):

atlbase.h在用ATL進(jìn)行GUI程序設(shè)計(jì)的時(shí)候,就如同SDK中的windows.h一樣重要。對于GUI程序設(shè)計(jì)的部分,這個(gè)文件中主要有這么幾個(gè)值得關(guān)注的地方:

  1. Win32程序設(shè)計(jì)必備的頭文件,諸如windows.h、tchar.h等。
  2. CComModule的定義。對于GUI程序設(shè)計(jì),我們可以將它簡單地看作對HINSTANCE的一個(gè)封裝。
  3. 一些簡單的工具類。(請?jiān)徫也荒茉谶@里提供給你它們具體的名字,因?yàn)锳TL 3.0和ATL 7.0是不一樣的。VC 6.0附帶的是ATL 3.0,它的atlbase.h中主要提供了一些COM的智能指針和字符串,如CComPtr、CComBSTR等;而VS2003中的ATL 7.0中則附帶了一些更有趣的類,比如CRegKey、CHandle等。)

下面接著說CComModule。相信你可以從它的類名稱中看出來,這個(gè)類主要用來管理COM的各種信息。如果你深入到ATL的源代碼之中,你可能會(huì)為它的眾多成員與方法感覺到迷惑。其實(shí)在進(jìn)行GUI程序設(shè)計(jì)的時(shí)候,你只需要關(guān)心以下這些內(nèi)容:

  1. HRESULT CComModule::Init( _ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = NULL );
    進(jìn)行模塊的初始化,第一個(gè)參數(shù)取NULL,第二個(gè)參數(shù)取應(yīng)用程序的實(shí)例句柄,也就是WinMain中傳入的hInstance。
  2. void CComModule::Term();
    進(jìn)行模塊的卸載,在程序結(jié)束時(shí)調(diào)用。
  3. HINSTANCE CComModule::GetModuleInstance();
    獲取應(yīng)用程序?qū)嵗浔鶦ComModule::m_hInst。
  4. HINSTANCE CComModule::GetResourceInstance();
    獲取資源模塊句柄CComModule::m_hInstResource,這個(gè)值在默認(rèn)情況下是和CComModule::m_hInst一致的。如果你程序的所有資源位于一個(gè)DLL之中,那么你可以在初始化應(yīng)用程序中將CComModule::m_hInstResource成員賦值為這個(gè)DLL的模塊句柄。

接著說CComModule的實(shí)例_Module。可以說,這個(gè)全局變量貫穿于ATL整個(gè)框架的始終,無論你是使用它編寫COM組件還是GUI程序。譬如,你可能不止一次地需要使用模塊的實(shí)例句柄(LoadIcon、LoadCursor),那么你只需要這樣調(diào)用:

extern CComModule _Module;
HICON hIcon = ::LoadIcon( _Module.GetResourceInstance(), MAKEINTRESOURCE( IDI_YOURICON ) );

好了,那么現(xiàn)在我們可以充分展示一下這個(gè)模塊類的具體使用了。在此,我僅僅將我先前的“Hello, World!”作了一番擴(kuò)展,如下:

//////////////////////////////////////////////////////////////////////////
// ATL的GUI程序設(shè)計(jì)配套源代碼
// 第一章 不能免俗的“Hello, World!”
// 工程名稱:HelloWorldEx
// 作者:李馬
// http://www.titilima.cn
//////////////////////////////////////////////////////////////////////////

#include <atlbase.h>
CComModule _Module;

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    _Module.Init( NULL, hInstance );
    _Module.m_hInstResource = LoadLibrary( _T("shell32.dll") );

    MSGBOXPARAMS mbp;
    ZeroMemory( &mbp, sizeof( mbp ) );
    mbp.cbSize       = sizeof( mbp );
    mbp.dwLanguageId = GetSystemDefaultLangID();
    mbp.dwStyle      = MB_USERICON;
    mbp.hInstance    = _Module.GetResourceInstance();
    mbp.lpszCaption  = _T("Hello");
    mbp.lpszIcon     = MAKEINTRESOURCE( 44 );
    mbp.lpszText     = _T("Hello, World!");
    MessageBoxIndirect( &mbp );

    FreeLibrary( _Module.m_hInstResource );
    _Module.m_hInstResource = NULL;
    _Module.Term();
    return 0;
}

這個(gè)程序運(yùn)行起來是這個(gè)樣子:

如你所見,在這里我使用了來自應(yīng)用程序之外的資源,也就是對CComModule::GetModuleInstance進(jìn)行了特殊處理。WTL就是對CComModule這個(gè)類進(jìn)行了繼承處理而派生出了CAppModule類,使之成為了更適合應(yīng)用程序使用的模塊類。有興趣的朋友可以參看WTL附帶的atlapp.h文件,我這里就不多說了。

“貌合神離”

字典上對這個(gè)詞的解釋是:“表面上很親密而實(shí)際上懷有二心”。在此,我將它用在ATL 3.0與7.0上,用來表示它們倆“用法兼容而實(shí)現(xiàn)迥異”的既有事實(shí)。不過,對于GUI程序設(shè)計(jì)而言,你并不需要深入了解這方面的內(nèi)容。因此我這里列舉的,也只是與GUI有關(guān)的部分。

  • ATL 3.0之中,CComModule直接繼承自_ATL_MODULE;而ATL 7.0之中,CComModule則經(jīng)歷了一串的繼承鏈。
  • 相比之下,ATL 7.0中的CComModule更有COM的味道,譬如它的ModuleInstance、ResourceInstance都可以作為COM組件的property,使用get、put來處理。

當(dāng)然,ATL畢竟是一個(gè)為開發(fā)COM組件而構(gòu)建的Framework,所以ATL 7.0中的atlbase.h之中還包含了更多有關(guān)COM開發(fā)的工具類。這些內(nèi)容與本書無關(guān),而且李馬也自認(rèn)現(xiàn)在尚無能力來解說這些內(nèi)容,所以一并從略了就。


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一级二级在线| 久久久在线视频| 亚洲在线网站| 欧美国产日韩一区二区三区| 亚洲欧美日韩专区| 国产精品高潮呻吟视频 | 欧美在线视频免费| 一区二区三区欧美成人| 欧美精品入口| 夜夜精品视频| 亚洲激情视频在线观看| 久久免费黄色| 亚洲娇小video精品| 欧美激情综合| 夜夜嗨av一区二区三区四季av| 亚洲色诱最新| 日韩视频亚洲视频| 欧美日韩网址| 午夜一区在线| 欧美在线视频播放| 精品1区2区| 欧美肥婆在线| 欧美日韩综合久久| 亚洲欧美999| 亚洲欧美激情在线视频| 国产永久精品大片wwwapp| 久久漫画官网| 欧美丰满高潮xxxx喷水动漫| 99国产一区二区三精品乱码| 一区二区成人精品| 韩国三级在线一区| 欧美大片在线观看| 欧美日韩国产精品专区| 欧美在线免费观看亚洲| 久久激五月天综合精品| 亚洲精品少妇30p| 在线午夜精品自拍| 国模大胆一区二区三区| 亚洲黄色成人| 国产女人精品视频| 欧美成人三级在线| 国产精品久久久久久久久免费樱桃 | 尤物精品在线| 亚洲激情在线视频| 国产精品免费区二区三区观看| 欧美中文字幕视频| 女人香蕉久久**毛片精品| 亚洲欧美国产视频| 麻豆精品传媒视频| 西西人体一区二区| 欧美电影电视剧在线观看| 久久激情视频久久| 欧美日韩视频在线| 蜜桃av综合| 国产毛片精品国产一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久久久久久一区二区三区| 一本色道久久综合亚洲精品小说 | 欧美日韩在线播放| 噜噜噜躁狠狠躁狠狠精品视频 | 国产在线国偷精品产拍免费yy| 欧美成人国产| 国产精品一区二区在线观看不卡| 亚洲国产高潮在线观看| 国产一区91| 一区二区日韩伦理片| 亚洲激情不卡| 久久九九99| 欧美影院视频| 国产精品v欧美精品v日韩 | 亚洲欧美日本在线| 亚洲一区二区精品| 欧美激情亚洲| 欧美激情第4页| 影音先锋亚洲视频| 久久大香伊蕉在人线观看热2| 性欧美1819性猛交| 国产精品国产三级国产aⅴ浪潮| 最新国产成人av网站网址麻豆| 激情综合电影网| 欧美中文在线观看国产| 欧美在线一级va免费观看| 国产精品美女久久| 亚洲视频欧洲视频| 亚洲欧美日韩在线| 国产精品人人爽人人做我的可爱| 日韩午夜激情电影| 中国av一区| 欧美日韩中文字幕在线视频| 日韩午夜激情av| 亚洲一区二区精品| 国产精品国产三级国产aⅴ9色| 一区二区高清| 亚洲欧美在线视频观看| 国产精品丝袜久久久久久app| 亚洲在线第一页| 久久成人免费网| 国产在线精品成人一区二区三区| 性欧美video另类hd性玩具| 久久精品国产一区二区三| 国产日韩专区| 久久九九精品| 亚洲黄色在线观看| 一区二区三区久久久| 国产精品白丝av嫩草影院| 亚洲一级黄色| 久久人91精品久久久久久不卡| 一区在线影院| 欧美激情在线| 亚洲综合久久久久| 久久影院亚洲| 一区二区免费在线视频| 国产精品亚洲第一区在线暖暖韩国| 午夜亚洲激情| 欧美激情国产精品| 亚洲一区在线免费| 国外成人在线视频网站| 乱码第一页成人| 99精品国产热久久91蜜凸| 欧美在线观看天堂一区二区三区| 国产综合在线看| 欧美连裤袜在线视频| 亚洲在线1234| 免费在线亚洲| 亚洲一区二区视频| 国产日韩一区在线| 麻豆免费精品视频| 日韩小视频在线观看| 国产精品乱码人人做人人爱| 性色av香蕉一区二区| 男人的天堂亚洲| 亚洲私人影吧| 伊人久久噜噜噜躁狠狠躁| 欧美日本国产一区| 久久国产免费看| 一区二区欧美精品| 免费成人网www| 亚洲欧洲av一区二区三区久久| 在线观看国产精品淫| 国产精品久久波多野结衣| 久久午夜精品| 亚洲欧美电影在线观看| 亚洲国产mv| 久久嫩草精品久久久久| 亚洲网在线观看| 亚洲高清久久| 国产一区二区三区高清在线观看| 欧美日本高清| 久热国产精品| 欧美一二三区精品| 在线综合欧美| 亚洲精品国产视频| 欧美国产日本| 久久综合九色综合欧美就去吻| 亚洲伊人观看| 在线视频欧美日韩| 亚洲每日更新| 亚洲精品国产精品国自产观看浪潮 | 裸体女人亚洲精品一区| 亚洲欧美日韩在线高清直播| 99精品热6080yy久久| 欧美不卡在线视频| 久久综合狠狠| 久久亚洲精品网站| 久久精品人人做人人爽| 欧美一级片一区| 午夜视频在线观看一区二区| 亚洲先锋成人| 亚洲永久免费av| 亚洲在线观看视频网站| 国产精品99久久久久久久女警 | 亚洲伦理久久| 亚洲三级免费观看| 亚洲三级影院| 日韩一级片网址| 99re热这里只有精品视频| 亚洲精品一区二区三区蜜桃久 | 欧美成人午夜免费视在线看片| 久久精品91| 久久久久国产一区二区| 久久久欧美精品sm网站| 久久免费99精品久久久久久| 久久综合九色欧美综合狠狠| 欧美aⅴ99久久黑人专区| 欧美成年网站| 亚洲欧洲日韩在线| 一区二区三区国产精华| 亚洲综合电影| 久久免费99精品久久久久久| 欧美大片一区二区三区| 欧美午夜片欧美片在线观看| 国产女人精品视频| 在线观看视频日韩| 日韩性生活视频| 亚洲一区二区在线视频 | 国产日韩欧美中文在线播放| 国产免费观看久久黄| 国产一区高清视频| 91久久极品少妇xxxxⅹ软件| 日韩亚洲欧美成人|