<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2007年6月17日

    vc程序編譯注意

    自動生成的工程文件配置的PreprocessorDefinitions 是 WIN32;_DEBUG;_WINDOWS
    需要改成 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;UNICODE;_WIN32_WINNT=0x0501"

    有的項目編譯不了是因為 CharacterSet 的問題

    posted @ 2007-12-19 15:52 付軒 閱讀(244) | 評論 (0)編輯 收藏

    C++

    六年前,我剛熱戀“面向?qū)ο?#8221;(Object-Oriented)時,一口氣記住了近十個定義。六年后,我從幾十萬行程序中滾爬出來準備寫點心得體會時,卻無法解釋什么是“面向?qū)ο?#8221;,就象說不清楚什么是數(shù)學那樣。軟件工程中的時髦術(shù)語“面向?qū)ο蠓治?#8221;和“面向?qū)ο笤O(shè)計”,通常是針對“需求分析”和“系統(tǒng)設(shè)計”環(huán)節(jié)的。“面向?qū)ο?#8221;有幾大學派,就象如來佛、上帝和真主用各自的方式定義了這個世界,并留下一堆經(jīng)書來解釋這個世界。

      有些學者建議這樣找“對象”:分析一個句子的語法,找出名詞和動詞,名詞就是對象,動詞則是對象的方法(即函數(shù))。

      當年國民黨的文人為了對抗毛澤東的《沁園春·雪》,特意請清朝遺老們寫了一些對仗工整的詩,請蔣介石過目。老蔣看了氣得大罵:“娘希匹,全都有一股棺材里腐尸的氣味。”我看了幾千頁的軟件工程資料,終于發(fā)現(xiàn)自己有些“弱智”,無法理解“面向?qū)ο?#8221;的理論,同時醒悟到“編程是硬道理。”

      面向?qū)ο蟪绦蛟O(shè)計語言很多,如Smalltalk、Ada、Eiffel、Object Pascal、Visual Basic、C++等等。C++語言最討人喜歡,因為它兼容C 語言,并且具備C 語言的性能。近幾年,一種叫Java 的純面向?qū)ο笳Z言紅極一時,不少人叫喊著要用Java 革C++的命。我認為Java 好比是C++的外甥,雖然不是直接遺傳的,但也幾分象樣。外甥在舅舅身上玩耍時灑了一泡尿,倆人不該為此而爭吵。

      關(guān)于C++程序設(shè)計的書藉非常多,本章不講C++的語法,只講一些小小的編程道理。如果我能早幾年明白這些小道理,就可以大大改善數(shù)十萬行程序的質(zhì)量了。

    1. C++面向?qū)ο蟪绦蛟O(shè)計的重要概念

      早期革命影片里有這樣一個角色,他說:“我是黨代表,我代表黨,我就是黨。”后來他給同志們帶來了災難。

      會用C++的程序員一定懂得面向?qū)ο蟪绦蛟O(shè)計嗎?

      不會用C++的程序員一定不懂得面向?qū)ο蟪绦蛟O(shè)計嗎?

      兩者都未必。就象壞蛋入黨后未必能成為好人,好人不入黨未必變成壞蛋那樣。

      我不怕觸犯眾怒地說句大話:“C++沒有高手,C 語言才有高手。”在用C 和C++編程8年之后,我深深地遺憾自己不是C 語言的高手,更遺憾沒有人點撥我如何進行面向?qū)ο蟪绦蛟O(shè)計。我和很多C++程序員一樣,在享用到C++語法的好處時便以為自己已經(jīng)明白了面向?qū)ο蟪绦蛟O(shè)計。就象擠掉牙膏賣牙膏皮那樣,真是暴殄天物呀。

      人們不懂拼音也會講普通話,如果懂得拼音則會把普通話講得更好。不懂面向?qū)ο蟪绦蛟O(shè)計也可以用C++編程,如果懂得面向?qū)ο蟪绦蛟O(shè)計則會把C++程序編得更好。本節(jié)講述三個非常基礎(chǔ)的概念:“類與對象”、“繼承與組合”、“虛函數(shù)與多態(tài)”。理解這些概念,有助于提高程序的質(zhì)量,特別是提高“可復用性”與“可擴充性”。

    1.1 類與對象

      對象(Object)是類(Class)的一個實例(Instance)。如果將對象比作房子,那么類就是房子的設(shè)計圖紙。所以面向?qū)ο蟪绦蛟O(shè)計的重點是類的設(shè)計,而不是對象的設(shè)計。類可以將數(shù)據(jù)和函數(shù)封裝在一起,其中函數(shù)表示了類的行為(或稱服務(wù))。類提供關(guān)鍵字public、protected 和private 用于聲明哪些數(shù)據(jù)和函數(shù)是公有的、受保護的或者是私有的。

      這樣可以達到信息隱藏的目的,即讓類僅僅公開必須要讓外界知道的內(nèi)容,而隱藏其它一切內(nèi)容。我們不可以濫用類的封裝功能,不要把它當成火鍋,什么東西都往里扔。

      類的設(shè)計是以數(shù)據(jù)為中心,還是以行為為中心?

      主張“以數(shù)據(jù)為中心”的那一派人關(guān)注類的內(nèi)部數(shù)據(jù)結(jié)構(gòu),他們習慣上將private 類型的數(shù)據(jù)寫在前面,而將public 類型的函數(shù)寫在后面,如表8.1(a)所示。

      主張“以行為為中心”的那一派人關(guān)注類應該提供什么樣的服務(wù)和接口,他們習慣上將public 類型的函數(shù)寫在前面,而將private 類型的數(shù)據(jù)寫在后面,如表8.1(b)所示。

      很多C++教課書主張在設(shè)計類時“以數(shù)據(jù)為中心”。我堅持并且建議讀者在設(shè)計類時“以行為為中心”,即首先考慮類應該提供什么樣的函數(shù)。Microsoft 公司的COM 規(guī)范的核心是接口設(shè)計,COM 的接口就相當于類的公有函數(shù)[Rogerson 1999]。在程序設(shè)計方面,咱們不要懷疑Microsoft 公司的風格。

      設(shè)計孤立的類是比較容易的,難的是正確設(shè)計基類及其派生類。因為有些程序員搞不清楚“繼承”(Inheritance)、“組合”(Composition)、“多態(tài)”( Polymorphism)這些概念。

    posted @ 2007-12-12 09:18 付軒 閱讀(188) | 評論 (0)編輯 收藏

    C++

    1.2 繼承與組合

      如果A 是基類,B 是A 的派生類,那么B 將繼承A 的數(shù)據(jù)和函數(shù)。示例程序如下:

    class A
    {
    public:
    void Func1(void);
    void Func2(void);
    };
    class B : public A
    {
    public:
    void Func3(void);
    void Func4(void);
    };
    // Example
    main()
    {
    B b; // B的一個對象
    b.Func1(); // B 從A 繼承了函數(shù)Func1
    b.Func2(); // B 從A 繼承了函數(shù)Func2
    b.Func3();
    b.Func4();
    }

      這個簡單的示例程序說明了一個事實:C++的“繼承”特性可以提高程序的可復用性。正因為“繼承”太有用、太容易用,才要防止亂用“繼承”。我們要給“繼承”立一些使用規(guī)則:

      一、如果類A 和類B 毫不相關(guān),不可以為了使B 的功能更多些而讓B 繼承A 的功能。

      不要覺得“不吃白不吃”,讓一個好端端的健壯青年無緣無故地吃人參補身體。

      二、如果類B 有必要使用A 的功能,則要分兩種情況考慮:

      (1)若在邏輯上B 是A 的“一種”(a kind of ),則允許B 繼承A 的功能。如男人(Man)是人(Human)的一種,男孩(Boy)是男人的一種。那么類Man 可以從類Human 派生,類Boy 可以從類Man 派生。示例程序如下:

    class Human
    {

    };
    class Man : public Human
    {

    };
    class Boy : public Man
    {

    };

      (2)若在邏輯上A 是B 的“一部分”(a part of),則不允許B 繼承A 的功能,而是要用A和其它東西組合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是頭(Head)的一部分,所以類Head 應該由類Eye、Nose、Mouth、Ear 組合而成,不是派生而成。示例程序如下:

    class Eye
    {
    public:
    void Look(void);
    };
    class Nose
    {
    public:
    void Smell(void);
    };
    class Mouth
    {
    public:
    void Eat(void);
    };
    class Ear
    {
    public:
    void Listen(void);
    };
    // 正確的設(shè)計,冗長的程序
    class Head
    {
    public:
    void Look(void) { m_eye.Look(); }
    void Smell(void) { m_nose.Smell(); }
    void Eat(void) { m_mouth.Eat(); }
    void Listen(void) { m_ear.Listen(); }
    private:
    Eye m_eye;
    Nose m_nose;
    Mouth m_mouth;
    Ear m_ear;
    };

      如果允許Head 從Eye、Nose、Mouth、Ear 派生而成,那么Head 將自動具有Look、Smell、Eat、Listen 這些功能:

    // 錯誤的設(shè)計
    class Head : public Eye, public Nose, public Mouth, public Ear
    {
    };

      上述程序十分簡短并且運行正確,但是這種設(shè)計卻是錯誤的。很多程序員經(jīng)不起“繼承”的誘惑而犯下設(shè)計錯誤。

      一只公雞使勁地追打一只剛下了蛋的母雞,你知道為什么嗎?

      因為母雞下了鴨蛋。

      本書3.3 節(jié)講過“運行正確”的程序不見得就是高質(zhì)量的程序,此處就是一個例證。

    posted @ 2007-12-12 09:18 付軒 閱讀(186) | 評論 (0)編輯 收藏

    C++

    1.3 虛函數(shù)與多態(tài)

      除了繼承外,C++的另一個優(yōu)良特性是支持多態(tài),即允許將派生類的對象當作基類的對象使用。如果A 是基類,B 和C 是A 的派生類,多態(tài)函數(shù)Test 的參數(shù)是A 的 指針。那么Test 函數(shù)可以引用A、B、C 的對象。示例程序如下:

    class A
    {
    public:
    void Func1(void);
    };
    void Test(A *a)
    {
    a->Func1();
    }
    class B : public A
    {

    };
    class C : public A
    {

    };
    // Example
    main()
    {
    A a;
    B b;
    C c;
    Test(&a);
    Test(&b);
    Test(&c);
    };

      以上程序看不出“多態(tài)”有什么價值,加上虛函數(shù)和抽象基類后,“多態(tài)”的威力就顯示出來了。

      C++用關(guān)鍵字virtual 來聲明一個函數(shù)為虛函數(shù),派生類的虛函數(shù)將(override)基類對應的虛函數(shù)的功能。示例程序如下:

    class A
    {
    public:
    virtual void Func1(void){ cout<< “This is A::Func1 \n”}
    };
    void Test(A *a)
    {
    a->Func1();
    }
    class B : public A
    {
    public:
    virtual void Func1(void){ cout<< “This is B::Func1 \n”}
    };
    class C : public A
    {
    public:
    virtual void Func1(void){ cout<< “This is C::Func1 \n”}
    };
    // Example
    main()
    {
    A a;
    B b;
    C c;
    Test(&a); // 輸出This is A::Func1
    Test(&b); // 輸出This is B::Func1
    Test(&c); // 輸出This is C::Func1
    };

      如果基類A 定義如下:

    class A
    {
    public:
    virtual void Func1(void)=0;
    };

      那么函數(shù)Func1 叫作純虛函數(shù),含有純虛函數(shù)的類叫作抽象基類。抽象基類只管定義純虛函數(shù)的形式,具體的功能由派生類實現(xiàn)。

      結(jié)合“抽象基類”和“多態(tài)”有如下突出優(yōu)點:

      (1)應用程序不必為每一個派生類編寫功能調(diào)用,只需要對抽象基類進行處理即可。這一
    招叫“以不變應萬變”,可以大大提高程序的可復用性(這是接口設(shè)計的復用,而不是代碼實現(xiàn)的復用)。

      (2)派生類的功能可以被基類指針引用,這叫向后兼容,可以提高程序的可擴充性和可維護性。以前寫的程序可以被將來寫的程序調(diào)用不足為奇,但是將來寫的程序可以被以前寫的程序調(diào)用那可了不起。

    posted @ 2007-12-12 09:17 付軒 閱讀(186) | 評論 (0)編輯 收藏

    C++

    2.3 new、delete 與指針

      在C++中,操作符new 用于申請內(nèi)存,操作符delete 用于釋放內(nèi)存。在C 語言中,函數(shù)malloc 用于申請內(nèi)存,函數(shù)free 用于釋放內(nèi) 存。由于C++兼容C 語言,所以new、delete、malloc、free 都有可能一起使用。new 能比malloc 干更多的事,它可以申請對象的內(nèi)存,而malloc 不能。C++和C 語言中的指針威猛無比,用錯了會帶來災難。對于一個指針p,如果是用new申請的內(nèi)存,則必須用delete 而不能用free 來釋放。如果是用malloc 申請的內(nèi)存,則必須用free 而不能用delete 來釋放。在用delete 或用free 釋放p 所指的內(nèi)存后,應該馬上顯式地將p 置為NULL,以防下次使用p 時發(fā)生錯誤。示例程序如下:

    void Test(void)
    {
    float *p;
    p = new float[100];
    if(p==NULL) return;
    …// do something
    delete p;
    p=NULL; // 良好的編程風格
    // 可以繼續(xù)使用p
    p = new float[500];
    if(p==NULL) return;
    …// do something else
    delete p;
    p=NULL;
    }

      我們還要預防“野指針”,“野指針”是指向“垃圾”內(nèi)存的指針,主要成因有兩種:

      (1)指針沒有初始化。
      (2)指針指向已經(jīng)釋放的內(nèi)存,這種情況最讓人防不勝防,示例程序如下:

    class A
    {
    public:
    void Func(void){…}
    };
    void Test(void)
    {
    A *p;
    {
    A a;
    p = &a; // 注意a 的生命期
    }
    p->Func(); // p 是“野指針”,程序出錯
    }

    2.4 使用const

      在定義一個常量時,const 比#define 更加靈活。用const 定義的常量含有數(shù)據(jù)類型,該常量可以參與邏輯運算。例如:

    const int LENGTH = 100; // LENGTH 是int 類型
    const float MAX=100; // MAX 是float 類型
    #define LENGTH 100 // LENGTH 無類型
    #define MAX 100 // MAX 無類型

      除了能定義常量外,const 還有兩個“保護”功能:

      一、強制保護函數(shù)的參數(shù)值不發(fā)生變化

      以下程序中,函數(shù)f 不會改變輸入?yún)?shù)name 的值,但是函數(shù)g 和h 都有可能改變name的值。

    void f(String s); // pass by value
    void g(String &s); // pass by referance
    void h(String *s); // pass by pointer
    main()
    {
    String name=“Dog”;
    f(name); // name 的值不會改變
    g(name); // name 的值可能改變
    h(name); // name 的值可能改變
    }

      對于一個函數(shù)而言,如果其‘&’或‘*’類型的參數(shù)只作輸入用,不作輸出用,那么應當在該參數(shù)前加上const,以確保函數(shù)的代碼不會改變該參數(shù)的值(如果改變了該參數(shù)的值,編譯器會出現(xiàn)錯誤警告)。因此上述程序中的函數(shù)g 和h 應該定義成:

    void g(const String &s);
    void h(const String *s);

      二、強制保護類的成員函數(shù)不改變?nèi)魏螖?shù)據(jù)成員的值

      以下程序中,類stack 的成員函數(shù)Count 僅用于計數(shù),為了確保Count 不改變類中的任何數(shù)據(jù)成員的值,應將函數(shù)Count 定義成const 類型。

    class Stack
    {
    public:
    void push(int elem);
    void pop(void);
    int Count(void) const; // const 類型的函數(shù)
    private:
    int num;
    int data[100];
    };
    int Stack::Count(void) const
    {
    ++ num; // 編譯錯誤,num 值發(fā)生變化
    pop(); // 編譯錯誤,pop 將改變成員變量的值
    return num;
    }

    posted @ 2007-12-12 09:16 付軒 閱讀(224) | 評論 (0)編輯 收藏

    windows 的變量類型

    ATOM                   原子(原子表中的一個字符串的參考)
    BOOL                   布爾變量
    BOOLEAN                布爾變量
    BYTE                   字節(jié)(8位)
    CCHAR                  Windows字符
    CHAR                   Windows字符
    COLORREF               紅、綠、藍(RGB)彩色值(32位)
    Const                  變量,該變量的值在執(zhí)行期間保持為常量
    CRITICAL_SECTION       臨界段對象
    CTRYID                 國名標識符
    DLGPROC                指向一個對話框過程的指針
    DWORD                  雙字(32位)
    ENHMFENUMPROC          指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉增強的元文件記錄
    ENUMRESLANGPROC        指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉資源語言。
    ENUMRESNAMEPROC        指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉資源名稱。
    ENUMRESTYPEPROC        指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉資源類型。  
    FARPROC                指向一個回調(diào)函數(shù)的指針
    FLOAT                  浮點變量
    FMORDER                32位字體映射值的數(shù)組
    FONTENUMPROC           指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉字體
    GOBJENUMPROC           指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉圖形設(shè)備接口(GDI)對象
    HACCEL                 加速鍵表句柄
    HANDLE                 對象的句柄
    HBITMAP                位圖句柄
    HBRUSH                 畫刷句柄
    HCONV                  動態(tài)數(shù)據(jù)交換(DDE)會話句柄
    HCONVLIST              DDE會話句柄
    HCURSOR                光標句柄
    HDC                    設(shè)備描述表(DC)句柄
    HDDEDATA               DDE數(shù)據(jù)句柄
    HDLG                   對話框句柄
    HDWP                   延期窗口位置結(jié)構(gòu)句柄
    HENHMETAFILE           增強原文件句柄
    HFILE                  文件句柄
    HFONT                  字體句柄
    HGDIOBJ                GDI對象句柄
    HGLOBAL                全局內(nèi)存塊句柄
    HHOOK                  鉤子句柄
    HICON                  圖標句柄
    HINSTANCE              實例句柄
    HKEY                   登記關(guān)鍵字句柄
    HLOCAL                 局部內(nèi)存塊句柄
    HMEMU                  菜單句柄
    HMETAFILE              元文件句柄
    HMIDIIN                樂器的數(shù)字化接口(MIDI)輸入文件句柄
    HMIDIOUT               MIDI輸出文件句柄
    HMMIO                  文件句柄
    HOOKPROC               指向一個應用程序定義的鉤子函數(shù)的指針
    HPALETTE               調(diào)色板句柄
    HPEN                   畫筆句柄
    HRGN                   域句柄
    HRSRC                  資源句柄
    HSZ                    DDE字符串句柄
    HWAVEIN                波形輸入文件句柄
    HWAVEOUT               波形輸出文件句柄
    HWINSTA                工作站句柄
    HWND                   窗口句柄
    INT                    符號整數(shù)
    LANGID                 語言標識符
    LCID                   所在國(Locale)標識符
    LCTYPE                 所在國類型
    LINEDDAPROC            指向一個回調(diào)函數(shù)的指針,該回調(diào)函數(shù)處理行坐標
    LONG                   32位符號整數(shù)
    LP                     指向一個以"NULL"結(jié)束的Unicode(TM)字符串的指針
    LPARAM                 32位消息參數(shù)
    LPBOOL                 指向一個布爾變量的指針
    LPBYTE                 指向一個字節(jié)的指針
    LPCCH                  指向一個Windows字符常量的指針
    LPCCHOOKPROC           指向一個應用程序定義的鉤子函數(shù)的指針
    LPCFHOOLPROC           指向一個應用程序定義的鉤子函數(shù)的指針
    LPCH                   指向一個Windows字符的指針
    LPCOLORREF             指向一個COLORREF值的指針
    LPCRITICAL_SECTION     指向一個臨界段對象的指針
    LPCSTR                 指向一個以"NULL"結(jié)束的WINDOWS字符串常量的指針
    LPCTSTR                指向一個以"NULL"結(jié)束的Unicode或Windows字符串常量的指針        
    LPCWCH                 指向一個以"NULL"指向一個以"NULL"結(jié)束的Unicode字符常量的指針   
    LPCWSTR                指向一個以"NULL"指向一個以"NULL"結(jié)束的Unicode字符串常量的指針  
    LPDWORD                指向一個無符號雙字(32位)的指針                 
    LPFRHOOLPROC           指向一個應用程序定義的鉤子函數(shù)的指針
    LPHANDLE               指向一個句柄的指針
    LOHANDLER_FUNCTION     指向一個處理程序函數(shù)的指針
    LPHWAVEIN              指向一個波形輸入文件句柄的指針
    LPHWAVEOUT             指向一個波形輸出文件句柄的指針
    LPINT                  指向一個符號整數(shù)的指針
    LPLONG                 指向一個符號長整數(shù)(32位)的指針
    LPOFNHOOKPROC          指向一個應用程序定義的鉤子函數(shù)的指針
    LPPRINTHOOKPROC        指向一個應用程序定義的鉤子函數(shù)的指針
    LPSETUPHOOKPROC        指向一個應用程序定義的鉤子函數(shù)的指針
    LPTSTR                 指向一個以NULL結(jié)束的Unicode或Windows字符串的指針
    LRESULT                消息處理的符號結(jié)果
    LPVOID                 指向任何類型的指針
    LPWSTR                 指向一個以"NULL"結(jié)束的Unicode字符串的指針
    LUID                   局部唯一的標識符
    MCIDEVICEID            媒體控制接口(MCI)設(shè)備標識符
    MFENUMPROC             指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉元文件記錄
    MMRESULT               多媒體消息的處理結(jié)果
    NPSTR                  指向一個以"NULL"結(jié)束的Windows字符串的指針
    NWPSTR                 指向一個以"NULL"結(jié)束的Unicode字符串的指針
    PBOOL                  指向一個布爾變量的指針
    PBYTE                  指向一個字節(jié)的指針
    PCCH                   指向一個Windows字符常量的指針
    PCH                    指向一個Windows字符的指針
    PCHAR                  指向一個Windows字符的指針
    PCRITICAL_SECTION      指向一個臨界段對象的指針
    PCSTR                  指向一個以"NULL"結(jié)束的Windows字符串常量的指針
    PCWCH                  指向一個Unicode字符常量的指針
    PCWSTR                 指向一個以"NULL"結(jié)束的Unicode字符串常量的指針
    PDWORD                 指向一個無符號雙字的指針
    PFLOAT                 指向一個浮點變量的指針
    PFNCALLBACK            指向一個回調(diào)函數(shù)的指針
    PHANDLE                指向一個句柄的指針
    PHANDLER_ROUTINE       指向一個處理程序的指針
    PHKEY                  指向一個登記關(guān)鍵字的指針
    PINT                   指向一個符號整數(shù)的指針
    PLONG                  指向一個符號長整數(shù)的指針
    PLUID                  指向一個局部唯一的表示符(LUID)的指針
    PROPENUMPROC           指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉窗口特征
    PSHORT                 指向一個符號短整數(shù)的指針
    PSID                   指向一個加密標識符(SID)的指針
    PSTR                   指向一個以"NULL"結(jié)束的Windows字符串的指針
    PSZ                    指向一個以"NULL"結(jié)束的Windows字符串的指針
    PTCH                   指向一個Windows或Unicode字符的指針
    PTCHAR                 指向一個Windows或Unicode字符的指針
    PTSTR                  指向一個以"NULL"結(jié)束的Windows或Unicode字符串的指針
    PUCHAR                 指向一個無符號Windows字符的指針
    PUINT                  指向一個無符號整數(shù)的指針
    PULONG                 指向一個無符號長整數(shù)的指針
    PUSHORT                指向一個無符號短整數(shù)的指針
    PVOID                  指向任何類型的指針
    PWCH                   指向一個Unicode字符的指針
    PWCHAR                 指向一個Unicode字符的指針
    PWORD                  指向一個無符號字的指針
    PWSTR                  指向一個以"NULL"結(jié)束的Unicode字符串的指針
    REGSAM                 登記關(guān)鍵字的加密掩碼
    SC_HANDLE              服務(wù)句柄
    SERVICE_STATUS_HANDLE  服務(wù)狀態(tài)值句柄
    SHORT                  短整數(shù)
    SPHANDLE               指向一個句柄的指針
    TCHAR                  Unicode或Windows字符
    TIMERPROC              指向一個應用程序定義的定時器回調(diào)函數(shù)的指針
    UCHAR                  無符號Windows字符
    UINT                   無符號整數(shù)
    ULONG                  無符號長整數(shù)
    USHORT                 無符號短整數(shù)
    VOID                   任何類型
    WCHAR                  Unicode字符
    WNDENUMPROC            指向一個應用程序定義的回調(diào)函數(shù)的指針,該回調(diào)函數(shù)枚舉窗口
    WNDPROC                指向一個應用程序定義的窗口過程的指針
    WORD                   無符號字(16位)
    WPARAM                 32位消息參數(shù)
    YIELDPROC              指向一個輸出回調(diào)函數(shù)的指針

    posted @ 2007-11-30 19:39 付軒 閱讀(415) | 評論 (0)編輯 收藏

    J2EE For Weblogic開發(fā)中Weblogic.xml文件的配置 (轉(zhuǎn))

     

          weblogic Server允許通過設(shè)置weblogic應用程序擴展描述符(weblogic.xml)配置jsp容器,
    該文件通常位于web應用程序的web-inf目錄下。一般不通過修改weblogic文件直接配置,
    而是通過控制臺配置該文件,在Deploments-->web Application-->defaultWebApp中配置。
    可在開發(fā)和生產(chǎn)環(huán)境中配置不同的信息。
    主要配置信息:
    compilerSupportsEncoding //true--支持使用字符集
    encoding //指定jsp文件的默認字符集,如gb2312;
    vervose //是否將調(diào)試信息輸出到瀏覽器和日志;
    keepgenerated //是否讓編譯jsp文件產(chǎn)生的.java文件持續(xù)存在;
    Page Check Seconds //正數(shù)--在以秒為單位的時間間隔檢查jsp文件是否發(fā)生了修改,如果是則重新編譯;
               0--在每一個請求檢查jsp;
               -1--不對jsp文件進行檢查。
    Precompile //true--在weblogic服務(wù)器啟動時自動編譯所有的jsp。
    Debug Enable //true--是否允許調(diào)試。

    Weblogic .xml

    <? xml version="1.0" encoding="GB2312" ?>
    <! DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd" >
    < weblogic-web-app >
        
    <!--
            為web.xml所定義角色賦值
            如果是Weblogic 8.1 SP2 或者之前的版本,可以不定義security-role-assignment
            如果是SP3,必須手工添加所有principal(角色或角色組);
            詳細介紹請參考 PAFA3開發(fā)設(shè)計指南 文檔 。
         
    -->
        
    < security-role-assignment >
            
    <!--  role-name 必須跟web.xml中security-role標記下的role-name取值相同  -->
            
    < role-name > pafaDemoUser </ role-name >
            
    <!--  principal-name 必須是UM中定義的角色或者角色組,不能是用戶  -->
            
    < principal-name > r_usermanager_rm_user </ principal-name >
            
    < principal-name > p_g_rmtest03_myopr </ principal-name >     
            
    < principal-name > Administrators </ principal-name >     
        
    </ security-role-assignment >

        
    < jsp-descriptor >
            
    < jsp-param >
                
    < param-name > pageCheckSeconds </ param-name >
                
    < param-value > 1 </ param-value >
            
    </ jsp-param >
            
    < jsp-param >
                
    < param-name > compilerSupportsEncoding </ param-name >
                
    < param-value > true </ param-value >
            
    </ jsp-param >
            
    < jsp-param >
                
    < param-name > encoding </ param-name >
                
    < param-value > GB2312 </ param-value >
            
    </ jsp-param >
            
    < jsp-param >
                
    < param-name > verbose </ param-name >
                
    < param-value > true </ param-value >
            
    </ jsp-param >
            
    < jsp-param >
                
    < param-name > printNulls </ param-name >
                
    < param-value > false </ param-value >
            
    </ jsp-param >
            
    < jsp-param >
                
    < param-name > keepgenerated </ param-name >
                
    < param-value > true </ param-value >
            
    </ jsp-param >
        
    </ jsp-descriptor >
    </ weblogic-web-app >

    posted @ 2007-08-17 10:03 付軒| 編輯 收藏

    javascript

    all是一個集合,包含所有html對像的集合,寫一個程式,可以存取到所有的對像。像這樣:
    <script language="javascript">
    var obj="";
    for(i=0;i<document.all.length;i++)
    obj+=document.all[i].tagName+";";
    alert(obj);
    </script>
    注意要把程式放到</html>之后哦。

    posted @ 2007-08-10 06:55 付軒 閱讀(314) | 評論 (0)編輯 收藏

    java靜態(tài)工廠方法

    public class GlobalConfig {

    private static final GlobalConfig INSTANCE=new GlobalConfig();

           private GlobalConfig (){}//構(gòu)造方法

           }

          問題是:當?shù)谝淮握{(diào)用這個類時,private static final GlobalConfig INSTANCE=new GlobalConfig(); 被執(zhí)行 ,然后INSTANCE是不是就一直保留在內(nèi)存中,不會被java垃圾回收!

    posted @ 2007-07-14 20:00 付軒 閱讀(1108) | 評論 (1)編輯 收藏

    hibernate 延遲加載問題

    If we want the publisher object can be accessed outside the session, there will be two possible
    solutions. One is to initialize the publisher explicitly, we can call the method Hibernate.initialize()
    for this task. This will force the publisher object to be loaded from database.
    Session session = factory.openSession();
    try {
    Book book = (Book) session.get(Book.class, id);
    Hibernate.initialize(book.getPublisher());
    return book;
    } finally {
    session.close();
    }
    Another solution is to turn off the lazy initialization feature for this association. This may decrease
    the performance as the publisher object will be loaded together with the book object every time.
    <hibernate-mapping package="mo.org.cpttm.bookshop">
    <class name="Book" table="BOOK">
    ...
    <many-to-one name="publisher" class="Publisher" column="PUBLISHER_ID"
    lazy="false" />
    </class>
    </hibernate-mapping>

    posted @ 2007-07-03 17:23 付軒 閱讀(309) | 評論 (0)編輯 收藏

    定時執(zhí)行程序

    關(guān)于定時任務(wù),似乎跟時間操作的聯(lián)系并不是很大,但是前面既然提到了定時任務(wù),索性在這里一起解決了。
      設(shè)置定時任務(wù)很簡單,用Timer類就搞定了。
      一、延時執(zhí)行
      首先,我們定義一個類,給它取個名字叫TimeTask,我們的定時任務(wù),就在這個類的main函數(shù)里執(zhí)行。代碼如下:
      package test;
      import java.util.Timer;
      public class TimeTask {
      public static void main(String[] args){
      Timer timer = new Timer();
      timer.schedule(new Task(), 60 * 1000);
      }
      }
      解釋一下上面的代碼。
      上面的代碼實現(xiàn)了這樣一個功能,當TimeTask程序啟動以后,過一分鐘后執(zhí)行某項任務(wù)。很簡單吧:先new一個Timer對象,然后調(diào)用它的schedule方法,這個方法有四個重載的方法,這里我們用其中一個,
      public void schedule(TimerTask task,long delay)
      首先,第一個參數(shù)
      第一個參數(shù)就是我們要執(zhí)行的任務(wù)。
      這是一個TimerTask對象,確切點說是一個實現(xiàn)TimerTask的類的對象,因為TimerTask是個抽象類。上面的代碼里面,Task就是我們自己定義的實現(xiàn)了TimerTask的類,因為是在同一個包里面,所以沒有顯性的import進來。Task類的代碼如下
      package test;
      import java.util.TimerTask;
      public class Task extends TimerTask {
      public void run(){
      System.out.println("定時任務(wù)執(zhí)行");
      }
      }
      我們的Task必須實現(xiàn)TimerTask的方法run,要執(zhí)行的任務(wù)就在這個run方法里面,這里,我們只讓它往控制臺打一行字。
      第二個參數(shù)
      第二個參數(shù)是一個long型的值。這是延遲的時間,就是從程序開始以后,再過多少時間來執(zhí)行定時任務(wù)。這個long型的值是毫秒數(shù),所以前面我們的程序里面,過一分鐘后執(zhí)行用的參數(shù)值就是 60 * 1000。
      二、循環(huán)執(zhí)行
      設(shè)置定時任務(wù)的時候,往往我們需要重復的執(zhí)行這樣任務(wù),每隔一段時間執(zhí)行一次,而上面的方法是只執(zhí)行一次的,這樣就用到了schedule方法的是另一個重載函數(shù)
      public void schedule(TimerTask task,long delay,long period)
      前兩個參數(shù)就不用說什么了,最后一個參數(shù)就是間隔的時間,又是個long型的毫秒數(shù)(看來java里涉及到時間的,跟這個long是脫不了干系了),比如我們希望上面的任務(wù)從第一次執(zhí)行后,每個一分鐘執(zhí)行一次,第三個參數(shù)值賦60 * 1000就ok了。
      三、指定執(zhí)行時間
      既然號稱是定時任務(wù),我們肯定希望由我們來指定任務(wù)指定的時間,顯然上面的方法就不中用了,因為我們不知道程序什么時間開始運行,就沒辦法確定需要延時多少。沒關(guān)系,schedule四個重載的方法還沒用完呢。用下面這個就OK了:
      public void schedule(TimerTask task,Date time)
      比如,我們希望定時任務(wù)2006年7月2日0時0分執(zhí)行,只要給第二個參數(shù)傳一個時間設(shè)置為2006年7月2日0時0分的Date對象就可以了。
      有一種情況是,可能我們的程序啟動的時候,已經(jīng)是2006年7月3日了,這樣的話,程序一啟動,定時任務(wù)就開始執(zhí)行了。
      schedule最后一個重載的方法是
      public void schedule(TimerTask task,Date firstTime,long period)

    posted @ 2007-06-27 11:59 付軒 閱讀(3263) | 評論 (0)編輯 收藏

    List 集合 找出最小值 和 最大 值

    import java.util.*;
    class Peng{  
        public static void main(String args[])
         {        //Double[] num = { 45.1,45.2 };
                  List dlist=new ArrayList();
                  dlist.add(45.1);
                  dlist.add(45.2);
                  dlist.add(110.22);
                  Double max = (Double)dlist.get(0);    
                  Double min = (Double)dlist.get(0);
                for (int i = 0; i < dlist.size(); i++) {         
                          if (min > (Double)dlist.get(i)) min = (Double)dlist.get(i);  
                           if (max < (Double)dlist.get(i)) max = (Double)dlist.get(i);       
                   }       
                            System.out.println("max的值為" + max + "min的值為" + min);   
          }

    posted @ 2007-06-26 20:50 付軒 閱讀(24187) | 評論 (2)編輯 收藏

    替換字符串

     public class StyleSearchAndReplace {
     public static void main(String args[]) {

       String statement = "The question as to whether the jab is"
           + " superior to the cross has been debated for some time in"
           + " boxing circles. However, it is my opinion that this"
           + " false dichotomy misses the point. I call your attention"
           + " to the fact that the best boxers often use a combination of"
           + " the two. I call your attention to the fact that Mohammed"
           + " Ali,the Greatest of the sport of boxing, used both. He had"
           + " a tremendous jab, yet used his cross effectively, often,"
           + " and well";

       String newStmt = statement.replaceAll("The question as to whether",
           "Whether");

       newStmt = newStmt.replaceAll(" of the sport of boxing", "");
       newStmt = newStmt.replaceAll("amount of success", "success");
       newStmt = newStmt.replaceAll("However, it is my opinion that this",
           "This");

       newStmt = newStmt.replaceAll("a combination of the two", "both");
       newStmt = newStmt.replaceAll("This is in spite of the fact that"
           + " the", "The");
       newStmt = newStmt.replaceAll("I call your attention to the fact that",
           "");

       System.out.println("BEFORE:\n" + statement + "\n");
       System.out.println("AFTER:\n" + newStmt);
     }
    }

    posted @ 2007-06-26 16:01 付軒 閱讀(258) | 評論 (0)編輯 收藏

    得到某一天是星期幾

    //獲取yyyy-MM-dd是星期幾
    public static int getWeekdayOfDateTime(String datetime){
       DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
       Calendar c = Calendar.getInstance();  
          try {
      c.setTime(df.parse(datetime));
       } catch (Exception e) {
      e.printStackTrace();
       }
       int weekday = c.get(Calendar.DAY_OF_WEEK)-1;
       return weekday;
    }

    posted @ 2007-06-26 13:25 付軒 閱讀(2636) | 評論 (0)編輯 收藏

    javamail 郵件群發(fā)

    package gmailsender;

    import java.security.Security;
    import java.util.Date;
    import java.util.Properties;

    import javax.mail.Authenticator;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;

    /**
     * 使用Gmail發(fā)送郵件
     * @author Winter Lau
     */
    public class Main {

     public static void main(String[] args) throws AddressException, MessagingException {
      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
      final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
      // Get a Properties object
      Properties props = System.getProperties();
      props.setProperty("mail.smtp.host", "smtp.gmail.com");
      props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
      props.setProperty("mail.smtp.socketFactory.fallback", "false");
      props.setProperty("mail.smtp.port", "465");
      props.put("mail.smtp.auth", "true");
      final String username = "username";
      final String password = "password";
      Session session = Session.getDefaultInstance(props, new Authenticator(){
          protected PasswordAuthentication getPasswordAuthentication() {
              return new PasswordAuthentication(username, password);
          }});

    // -- Create a new message --
      Message msg = new MimeMessage(session);
     // -- Set the FROM and TO fields --
      String[] gods={"dfgd@yahoo.com.cn","dfgdf@qq.com"};
      int len=gods.length;
      InternetAddress[] address = new InternetAddress[len];
         for (int i = 0; i < gods.length; i++) {
          address[i] = new InternetAddress(gods[i]);
         }
      msg.setFrom(new InternetAddress("fgdfgf@gmail.com"));
      //msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse("dgddfg@qq.com",false));
      msg.setRecipients(Message.RecipientType.TO,address);
      msg.setSubject("woaizhongguo");
      msg.setText("woaizhongguo");
      msg.setSentDate(new Date());
      Transport.send(msg);
      System.out.println("郵件已發(fā)送!");
     

    }
    }


     

    posted @ 2007-06-22 19:09 付軒 閱讀(682) | 評論 (0)編輯 收藏

    javamail

    package gmailsender;

    import java.security.Security;
    import java.util.Date;
    import java.util.Properties;

    import javax.mail.Authenticator;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;

    /**
     * 使用Gmail發(fā)送郵件
     * @author Winter Lau
     */
    public class Main {

     public static void main(String[] args) throws AddressException, MessagingException {
      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
      final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
      // Get a Properties object
      Properties props = System.getProperties();
      props.setProperty("mail.smtp.host", "smtp.gmail.com");
      props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
      props.setProperty("mail.smtp.socketFactory.fallback", "false");
      props.setProperty("mail.smtp.port", "465");
      props.setProperty("mail.smtp.socketFactory.port", "465");
      props.put("mail.smtp.auth", "true");
      final String username = "";
      final String password = "";
      Session session = Session.getDefaultInstance(props, new Authenticator(){
          protected PasswordAuthentication getPasswordAuthentication() {
              return new PasswordAuthentication(username, password);
          }});

           // -- Create a new message --
      Message msg = new MimeMessage(session);

      // -- Set the FROM and TO fields --
      msg.setFrom(new InternetAddress(username + "@gmail.com"));
      msg.setRecipients(Message.RecipientType.TO,
        InternetAddress.parse("fuxuan1986@gmail.com",false));
      msg.setSubject("Hello");
      msg.setText("How are you");
      msg.setSentDate(new Date());
      Transport.send(msg);
      System.out.println("Message sent.");
     }
    }


     

    posted @ 2007-06-22 12:14 付軒 閱讀(198) | 評論 (0)編輯 收藏

    fdg

    fgdfgdfg

    posted @ 2007-06-17 19:48 付軒 閱讀(145) | 評論 (0)編輯 收藏

    <2007年6月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    導航

    統(tǒng)計

    常用鏈接

    留言簿(2)

    隨筆檔案

    相冊

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 九九免费观看全部免费视频| 9277手机在线视频观看免费| 久操视频在线免费观看| 国产男女爽爽爽爽爽免费视频| 亚洲熟妇av一区二区三区漫画| 亚洲乱码在线观看| 日本视频免费高清一本18| 亚洲综合色区中文字幕| 无码国产精品一区二区免费式芒果 | 91高清免费国产自产拍2021| 亚洲色大18成人网站WWW在线播放| 小日子的在线观看免费| 亚洲中文字幕无码亚洲成A人片| 国产亚洲精品AA片在线观看不加载 | 日本免费污片中国特一级| 亚洲最大天堂无码精品区| 亚洲熟女少妇一区二区| 永久免费av无码不卡在线观看| 久久国产精品亚洲一区二区| 国产黄在线观看免费观看不卡| 亚洲乱码日产精品a级毛片久久| 在线播放亚洲精品| 国产乱子影视频上线免费观看| 国产成人精品日本亚洲11| 亚洲最大av无码网址| 久久精品成人免费国产片小草 | 亚洲理论片在线观看| 国产va在线观看免费| 自拍偷自拍亚洲精品偷一| 免费一级毛片正在播放| 青青青视频免费观看| 国产综合亚洲专区在线| 日韩精品在线免费观看| 国产亚洲综合精品一区二区三区| 亚洲精品在线免费观看视频| 国产亚洲精品精品国产亚洲综合| 114一级毛片免费| 久久精品国产亚洲AV无码偷窥| 99在线精品视频观看免费| a级片免费观看视频| 亚洲日本香蕉视频观看视频|