• <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>

            陋居

            淡薄名利,修身養性

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              31 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

            常用鏈接

            留言簿

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            #

            如何得到DataGrid當前選中行的數據(VC++)

            /*================================
            * Function:
            * Author:wuhuiran(06-02-14)
            * Desc:得到DataGrid中當前選中行的值(字符)
            ==================================*/
             // 用CStringArray保存得到的數據
             CStringArray arrGetValue;
             arrGetValue.RemoveAll();
             
             VARIANT index;
             CColumns columns;
             CColumn column;
             index.vt=VT_INT;
             
             columns=m_wndGrid.GetColumns();  // 得到當前選中行的列集
             long nCount = columns.GetCount(); //列數

             for(int i = 0; i < nCount; i++)
             {
              index.lVal = i;
              column = columns.GetItem(index);//順序得到單元格的值
              CString strTemp;
              strTemp = column.GetText();
              arrGetValue.Add(strTemp);

             }


            posted @ 2010-08-02 13:29 eircQ 閱讀(1665) | 評論 (1)編輯 收藏

            c與匯編,以及嵌入式工程師應注意的問題

            人生哲理與經驗 2007-07-25 13:31:04 閱讀41 評論1 字號:

             匯編和c同樣重要,相互配合,缺一不可!

              匯編的重要性:

            ◆ 幫助你從根本上徹底和完全了解芯片的結構和性能,以及工作原理,如何使用。
            ◆ 在小的芯片上實現小的系統。
            ◆ 系統的調試。盡管你使用了高級語言,在調試中可以幫助你了解C代碼的性能和特點,甚至找到使用開發平臺本身的BUG。
            ◆ 編寫時序要求嚴格的代碼,實現一些高級語言不易實現的功能。

              將出版的AVR128的書里面,第五章中主使用C作為系統開發設計語言,這是因為M128的速度高,內部有4K的RAM,128KFLASH, 適合于實現比較高級的應用,所以采用C語言作為系統開發的設計語言。但作為開發工程師來講,熟悉M128的結構和應用原理,基本掌握它的匯編語言是必要的 基礎。

              從目前的技術和應用發展來看,對硬件工程師的要求越來越高。以我的觀點,作為單片機和嵌入式系統開發真正的高手,應具備以下幾個方面的綜合能力:

            ◆ 硬件。模擬、數字電路的雄厚基礎,了解跟蹤現在市場上的各種元器件的應用和發展,能夠進行可靠、完善的電路設計以及PCB的設計。
            ◆ 軟件。不僅需要精通匯編語言,也要精通C語言,要有好的單片機系統程序設計理念和能力,學校中學的那些分支結構、循環結構等基本原理遠遠不夠!要有基本的 數據結構的知識。否則你如何設計實現USB HOST讀U盤的接口?如何實現嵌入式WEB系統?以及如何使用真正了解和使用RTOS?
            ◆ 具備計算機網絡和數字通信的基礎知識,從根本上熟悉和了解各種協議的構造和實現,如:UART、RS232、SPI、I2C、USB、IEEE802、TCP/IP等。
            ◆ 計算機應用的高手。
            ◆ 熟練閱讀英文資料。
            ◆ 熱愛和喜歡電子技術,具備刻苦精神、踏踏實實,不弄虛作假,不浮躁。多動手,勤實踐。有強烈的專業和鉆研精神。最后一條最重要!

            posted @ 2010-07-25 11:43 eircQ 閱讀(274) | 評論 (0)編輯 收藏

            CString,int,string,char*之間的轉換


            《C++標準函數庫》中說的

            有三個函數可以將字符串的內容轉換為字符數組和C—string 

            1.data(),返回沒有”\0“的字符串數組 

            2,c_str(),返回有”\0“的字符串數組 

            3,copy()

            .................................................................

            int 轉 CString:

            CString.Format("%d",int);

            ...............................

            string 轉 CString 

            CString.format("%s", string.c_str()); 

            用c_str()確實比data()要好. 

            .......................................

            char* 轉 CString 

            CString.format("%s", char*); 

             CString strtest; 

             char * charpoint; 

             charpoint="give string a value"; 

             strtest=charpoint; //直接付值

            ...................................................................

            CString 轉 int

             CString  ss="1212.12"; 

             int temp=atoi(ss); //atoi _atoi64或atol

             

            將字符轉換為整數,可以使用atoi、_atoi64或atol。 

            int int_chage = atoi((lpcstr)ss) ;

            或:

               CString str = "23";

               UINT uint;

               sscanf(str, "%d", uint);

            ..............................

            string 轉 int

            ..............................

            char* 轉 int

             #include <stdlib.h>

             

             int atoi(const char *nptr);

             long atol(const char *nptr);

             long long atoll(const char *nptr);

             long long atoq(const char *nptr);

            ...................................................................

            CString 轉 string

              string s(CString.GetBuffer()); 

              GetBuffer()后一定要ReleaseBuffer(),否則就沒有釋放緩沖區所占的空間. 

            ..........................................

            int 轉 string

            ..........................................

            char* 轉 string 

             string s(char *); 

             你的只能初始化,在不是初始化的地方最好還是用assign().

            ...................................................................

            CString 轉 char *

             CString strtest="wwwwttttttt";

             charpoint=strtest.GetBuffer(strtest.GetLength());

            CString轉換 char[100] 

             char a[100]; 

             CString str("aaaaaa"); 

             strncpy(a,(LPCTSTR)str,sizeof(a));

              CString  str="aaa";  

              char*  ch;  

              ch=(char*)(LPCTSTR)str;

            ..........................................

            int 轉 char *

             在stdlib.h中有個函數itoa()

             itoa的用法:

             itoa(i,num,10);

             i 需要轉換成字符的數字

             num 轉換后保存字符的變量

             10 轉換數字的基數(進制)10就是說按照10進制轉換數字。還可以是2,8,16等等你喜歡的進制類型

             原形:char *itoa(int value, char* string, int radix);

             實例:

             #include "stdlib.h"

             #include "stdio.h"

             main()

             {

             int i=1234;

             char s[5];

             itoa(i,s,10);

             printf("%s",s);

             getchar();

            }

            ..........................................

            string 轉 char * 

            char *p = string.c_str(); 

             

             string aa("aaa");

             char *c=aa.c_str();

             string mngName;

             char t[200];

             memset(t,0,200);

             strcpy(t,mngName.c_str());

            ...................................................................

            標準C里沒有string,char *==char []==string

            可以用CString.Format("%s",char *)這個方法來將char *轉成CString。要把CString轉成char *,用操

            作符(LPCSTR)CString就可以了。

            cannot convert from 'const char *' to 'char *'

            const char *c=aa.c_str(); 

            string.c_str()只能轉換成const char *

             


            c++中char * 和 char []的區別

            問題引入:
            同樣char *c = "abc"和char c[]="abc",前者改變其內容程序是會崩潰的,而后者完全正確。
            程序演示:測試環境Devc++
            代碼
            #include <iostream>
            using namespace std;

            main()
            {
               char *c1 = "abc";
               char c2[] = "abc";
               char *c3 = ( char* )malloc(3);
               c3 = "abc";
               printf("%d %d %s\n",&c1,c1,c1);
               printf("%d %d %s\n",&c2,c2,c2);
               printf("%d %d %s\n",&c3,c3,c3);
               getchar();
             
            運行結果
            2293628 4199056 abc
            2293624 2293624 abc
            2293620 4199056 abc

            參考資料:
            首先要搞清楚編譯程序占用的內存的分區形式:
            一、預備知識—程序的內存分配
            一個由c/C++編譯的程序占用的內存分為以下幾個部分
            1、棧區(stack)—由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于

            數據結構中的棧。
            2、堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據

            結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
            3、全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態

            變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束后由系統

            釋放。
            4、文字常量區—常量字符串就是放在這里的。程序結束后由系統釋放。
            5、程序代碼區
            這是一個前輩寫的,非常詳細
            //main.cpp
              int a=0;    //全局初始化區
              char *p1;   //全局未初始化區
              main()
              {
               int b;棧
               char s[]="abc";   //棧
               char *p2;         //棧
               char *p3="123456";   //123456\0在常量區,p3在棧上。
               static int c=0;   //全局(靜態)初始化區
               p1 = (char*)malloc(10);
               p2 = (char*)malloc(20);   //分配得來得10和20字節的區域就在堆區。
               strcpy(p1,"123456");   //123456\0放在常量區,編譯器可能會將它與p3所向"123456"優化成一個

            地方。
            }
            二、堆和棧的理論知識
            2.1申請方式
            stack:
            由系統自動分配。例如,聲明在函數中一個局部變量int b;系統自動在棧中為b開辟空間
            heap:
            需要程序員自己申請,并指明大小,在c中malloc函數
            如p1=(char*)malloc(10);
            在C++中用new運算符
            如p2=(char*)malloc(10);
            但是注意p1、p2本身是在棧中的。
            2.2
            申請后系統的響應
            棧:只要棧的剩余空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
            堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,
            會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,并將

            該結點的空間分配給程序,另外,對于大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大

            小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由于找到的堆結點的大小不一定正

            好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中。
            2.3申請大小的限制
            棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地

            址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯

            時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間

            較小。
            堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地

            址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的

            虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
            2.4申請效率的比較:
            棧:由系統自動分配,速度較快。但程序員是無法控制的。
            堆:是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
            另外,在WINDOWS下,最好的方式是用Virtual Alloc分配內存,他不是在堆,也不是在棧,而是直接在進

            程的地址空間中保留一塊內存,雖然用起來最不方便。但是速度快,也最靈活。
            2.5堆和棧中的存儲內容
            棧:在函數調用時,第一個進棧的是主函數中后的下一條指令(函數調用語句的下一條可執行語句)的

            地址,然后是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然后是函數中的局部變

            量。注意靜態變量是不入棧的。
            當本次函數調用結束后,局部變量先出棧,然后是參數,最后棧頂指針指向最開始存的地址,也就是主

            函數中的下一條指令,程序由該點繼續運行。
            堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容由程序員安排。
            2.6存取效率的比較
            char s1[]="aaaaaaaaaaaaaaa";
            char *s2="bbbbbbbbbbbbbbbbb";
            aaaaaaaaaaa是在運行時刻賦值的;
            而bbbbbbbbbbb是在編譯時就確定的;
            但是,在以后的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。
            比如:
            #include
            voidmain()
            {
            char a=1;
            char c[]="1234567890";
            char *p="1234567890";
            a = c[1];
            a = p[1];
            return;
            }
            對應的匯編代碼
            10:a=c[1];
            004010678A4DF1movcl,byteptr[ebp-0Fh]
            0040106A884DFCmovbyteptr[ebp-4],cl
            11:a=p[1];
            0040106D8B55ECmovedx,dwordptr[ebp-14h]
            004010708A4201moval,byteptr[edx+1]
            004010738845FCmovbyteptr[ebp-4],al
            第一種在讀取時直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據

            edx讀取字符,顯然慢了。
            2.7小結:
            堆和棧的區別可以用如下的比喻來看出:
            使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會

            切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
            使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。

            自我總結:
            char *c1 = "abc";實際上先是在文字常量區分配了一塊內存放"abc",然后在棧上分配一地址給c1并指向

            這塊地址,然后改變常量"abc"自然會崩潰

            然而char c2[] = "abc",實際上abc分配內存的地方和上者并不一樣,可以從
            4199056
            2293624 看出,完全是兩塊地方,推斷4199056處于常量區,而2293624處于棧區

            2293628
            2293624
            2293620 這段輸出看出三個指針分配的區域為棧區,而且是從高地址到低地址

            2293620 4199056 abc 看出編譯器將c3優化指向常量區的"abc"


            繼續思考:
            代碼:
            #include <iostream>
            using namespace std;

            main()
            {
               char *c1 = "abc";
               char c2[] = "abc";
               char *c3 = ( char* )malloc(3);
               //  *c3 = "abc" //error
               strcpy(c3,"abc");
               c3[0] = 'g';
               printf("%d %d %s\n",&c1,c1,c1);
               printf("%d %d %s\n",&c2,c2,c2);
               printf("%d %d %s\n",&c3,c3,c3);
               getchar();
             
            輸出:
            2293628 4199056 abc
            2293624 2293624 abc
            2293620 4012976 gbc
            寫成注釋那樣,后面改動就會崩潰
            可見strcpy(c3,"abc");abc是另一塊地方分配的,而且可以改變,和上面的參考文檔說法有些不一定,


            posted @ 2010-07-21 14:48 eircQ 閱讀(618) | 評論 (0)編輯 收藏

            現在用oracle ,PL Sql中順手寫了個 select top 1 * from .....出錯提示末找到要求的關鍵字。。

            發現和SQL Server還不一樣。G一下原來是這樣:

            Select Top在不同數據庫中的使用用法:

            1. Oracle數據庫

            SELECT * FROM TABLE1 WHERE ROWNUM<=N

            2. Infomix數據庫

            SELECT FIRST N * FROM TABLE1

            3. DB2數據庫

            SELECT * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM WHERE ROWNUM<=N

            或者

            SELECT COLUMN FROM TABLE FETCH FIRST N ROWS ONLY

            4. SQL Server數據庫

            SELECT TOP N * FROM TABLE1

            5. Sybase數據庫

            SET ROWCOUNT N 
            GO
            SELECT * FROM TABLE1

            6. MySQL數據庫

            SELECT * FROM TABLE1 LIMIT N

            7. FoxPro數據庫

            SELECT * TOP N FROM TABLE ORDER BY COLUMN

            posted @ 2010-07-21 14:32 eircQ 閱讀(269) | 評論 (0)編輯 收藏

            寫入時間值
            COleDateTime   oleDate   =   COleDateTime::GetCurrentTime();
            _variant_t   vtFld;
            vtFld.vt   =   VT_DATE;
            vtFld.date   =   oleDate;
            pRecordSet4-> PutCollect( "date ",   vtFld);

            關于時間類型的幾種轉換
            strCString= "2003-10-27   6:24:37 ";   //CString---> COleDateTime
            COleVariant   vtime(strCString);
            vtime.ChangeType(VT_DATE);
            COleDateTime   time4=vtime;

            COleDateTime   time1(1977,4,16,2,2,2);   //COleDataTime---> CTime
            SYSTEMTIME   systime;
            VariantTimeToSystemTime(time1,   &systime);
            CTime   tm(systime);

            time_t   time2=tm.GetTime();   //CTime---> time_t
            COleDateTime   time3(time2);   //time_t---> COleDateTime

            posted @ 2010-07-12 15:17 eircQ 閱讀(1018) | 評論 (0)編輯 收藏

            記錄集的遍歷、更新

            根據我們剛才通過執行SQL命令建立好的users表,它包含四個字段:ID,username,old,birthday
            以下的代碼實現:
            打開記錄集,遍歷所有記錄,刪除第一條記錄,添加三條記錄,移動光標到第二條記錄,更改其年齡,保存到數據庫。

            _variant_t   vUsername,vBirthday,vID,vOld;

            _RecordsetPtr   m_pRecordset;

            m_pRecordset.CreateInstance( "ADODB.Recordset ");

            m_pRecordset->
            Open( "SELECT   *   FROM   users ",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);  

            while(!m_pRecordset-> adoEOF)
            ///這里為什么是adoEOF而不是EOF呢?還記得rename( "EOF ", "adoEOF ")這一句嗎?  

            {   vID   =   m_pRecordset-> GetCollect(_variant_t((long)0)
            );///取得第1列的值,從0開始計數,你也可以直接給出列的名稱,如下一行

            vUsername   =   m_pRecordset-> GetCollect( "username ");
            ///取得username字段的值

            vOld   =   m_pRecordset-> GetCollect( "old ");

            vBirthday   =   m_pRecordset-> GetCollect( "birthday ");
            ///在DEBUG方式下的OUTPUT窗口輸出記錄集中的記錄

            if(vID.vt   !=   VT_NULL   &&   vUsername.vt   !=   VT_NULL   &&   vOld.vt   !=   VT_NULL   &&   vBirthday.vt   !=   VT_NULL)

            TRACE( "id:%d,姓名:%s,年齡:%d,生日:%s\r\n ",vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday)   ;  

            m_pRecordset-> MoveNext();
            ///移到下一條記錄   }

            m_pRecordset-> MoveFirst();
            ///移到首條記錄   m_pRecordset-> Delete(adAffectCurrent);
            ///刪除當前記錄   ///添加三條新記錄并賦值

            for(int   i=0;i <3;i++)

            {

            m_pRecordset-> AddNew();///添加新記錄  
            m_pRecordset-> PutCollect( "ID ",_variant_t((long)(i+10)));
            m_pRecordset-> PutCollect( "username ",_variant_t( "葉利欽 "));
            m_pRecordset-> PutCollect( "old ",_variant_t((long)71));  
            m_pRecordset-> PutCollect( "birthday ",_variant_t( "1930-3-15 "));

            }  

            m_pRecordset-> Move(1,_variant_t((long)adBookmarkFirst));
            ///從第一條記錄往下移動一條記錄,即移動到第二條記錄處  

            m_pRecordset-> PutCollect(_variant_t( "old "),_variant_t((long)45));
            ///修改其年齡

            m_pRecordset-> Update();
            ///保存到庫中  
            posted @ 2010-07-12 14:32 eircQ 閱讀(447) | 評論 (0)編輯 收藏

            問題1.: fatal error C1083: 無法打開包含文件:“iostream.h”: No such file or directory
              解決辦法:
                將 #include 
            "iostream.h"                      //(vc++6.0)
                替換為:                                                //(vc++7.0 /vc++.net)                       
                    #include "IOSTREAM"  // 包含流的舊式頭文件 //使用舊的iostream頭文件不要加.h
                    using namespace std;                     //另需添加部分
            PLCHandler.obj : error LNK2001: unresolved external symbol "public: bool __thiscall PLCDB90::read(long,long,long * const)" (?read@PLCDB90@@QAE_NJJQAJ@Z)
            PLCHandler.obj : error LNK2001: unresolved external symbol 
            "public: bool __thiscall PLCDB80::read(long,long,long * const)" (?read@PLCDB80@@QAE_NJJQAJ@Z)
            bin
            /PlcOperation.exe : fatal error LNK1120: 2 unresolved externals
            在plcdb90.cpp文件中沒有對其實現
            PLCDB90::read(
            long,long,long * const)

            2*****************
            問題:
            --------------------Configuration: DataTrans - Win32 Debug--------------------
            Compiling
            DataTrans.cpp
            D:\VC60Projects\DataTrans\DataTrans.cpp(
            22) : error C2065: 'cout' : undeclared identifier
            D:\VC60Projects\DataTrans\DataTrans.cpp(
            22) : error C2297: '<<' : illegal, right operand has type 'char [4]'
            D:\VC60Projects\DataTrans\DataTrans.cpp(
            22) : error C2065: 'endl' : undeclared identifier
            D:\VC60Projects\DataTrans\DataTrans.cpp(
            23) : warning C4552: '<<' : operator has no effect; expected operator with side-effect
            PLCHandler.cpp
            DataHelper.cpp
            Generating Code
            Error executing cl.exe.

            DataTrans.exe 
            - 3 error(s), 1 warning(s)

            //****************************************************
            解決:

            在project setting里面的 c
            /c++ 選項卡 

            在combo里面找到 precompiled header 

            選擇 no precompiled header 即可 


            3***********************
            bool bflag型 
            bool 應大寫為 BOOL

            4***********************
            c1.h,c2.h 頭文件的互相包含
            c1.h中寫上#include 
            "c2.h",class c2;
            c2.h中同樣如此.

            5*******************************
            d:\shengwuproject\
            0911\dbcallback.cpp(15) : error C2371: 'public: static class PLC * cTestCallBack::pLCDB902' : redefinition; different basic types
                    d:\shengwuproject\
            0911\dbcallback.h(34) : see declaration of 'public: static class PLC * cTestCallBack::pLCDB902'
            PLC 
            *cTestCallBack::pLCDB902;  //靜態變量聲明
            前面聲明的類型plc和后面的*cTestCallBack::pLCDB902 變量類型plcdb90不一樣.


            6=============================
            已經包含了#include   
            <process.h>頭文件,編譯時仍然說'_beginthread'   undeclared   identifier
            解決:
            根據下列步驟進行設置.
            project
            ->settings->c/c++:   
              Category:Code   Generation   
              Use   run
            -time   library:   
              debug   version:   
              Debug   Multithread   DLL   
              release   version:   
                Multithread   DLL 

            7==============================
            問題:
            PLCDB90.obj : error LNK2001: unresolved external symbol 
            "class ATL::CComModule _Module" (?_Module@@3VCComModule@ATL@@A)
            bin
            /PlcOperation.exe : fatal error LNK1120: 1 unresolved externals
            解決:
             添加ATL頭文件
            使用ATL前必須包含以下頭文件:atlbase.h和atlcom.h,并且定義_Module變量[
            2]。把以下代碼加到stdafx.h是最方便的:
            #include 
            <atlbase.h>
            extern CComModule _Module;
            #include 
            <atlcom.h> 
            在cpp文件中要對_Module進行定義。如下: 
            CcomModule _Module;
            在添加了這兩行之后,我們就可以使用ATL的功能了。而不必創建ATL的項目。
            當然,如果項目是通過ATL項目向導產生的就不必再次添加頭文件了。
            http:
            //www.jr163.org/cup2/18/18781.htm
            8===================================
            問題:
            在MFC(界面)下調用PLC com組件,能響應Com回調dataChange事件,在控制臺程序則不能.
            原因:
            因為COM利用消息機制來實現STA,因此STA套間里的線程必須實現消息循環,否則COM將不能實現STA的要求。
            解決:
            在程序中加入:
            #include 
            <windows.h>
            // Main message loop:
            MSG msg;
            while/if(GetMessage(&msg, NULL, 00)) 
            {
            // TranslateMessage(&msg);
            DispatchMessage(&msg);
            }

            posted @ 2010-07-02 16:52 eircQ 閱讀(471) | 評論 (0)編輯 收藏

            總是有一些朋友看到我的作品受到刺激就問我如何像我一樣到這種水平, 這些問題一般是這些:

            • 我如何成為一個像你一樣牛B的開發者?
            • 我如何才能做出像你一樣牛B的項目?
            • 我怎么學C#才能像你一樣牛B?
            • 微軟認證有用么? 我應該去考么?
            • 你是怎么成為微軟MVP的, 我也想當.
            • 我現在也23(24)歲, 而且我也想像你一樣牛B, 我該怎么辦?

            一般他們問的問題就是這樣, 每個人都問我有什么捷徑可以成為一個真正牛B的Developer. 好吧, 下面就是我如何達到我現在的成就的秘密:

            每天工作18小時, 一周7天, 每年360, 堅持13年.

            哈~ 這就是我的竅門~ 很簡單是吧? 你唯一要做的事情就是除了工作什么都不做, 然后你就會想我現在一樣! 真的很簡單~ 你也可以的! 小菜一碟~

            如果你不想走捷徑, 想走"長"路, 你可以看看下面的:

            • 加入開發一些開源的項目, 也做幾個你自己的. 這是學習一些有用的東西的最好的方法.
            • 如果你可以的話, 試著創立自己的公司. 到現在我已經開了3個公司了, 兩個不是那么太成功, 但另外一個是很成功的, 這個公司讓我學到的了很多很多東西, 那些東西決不是你在別人的公司里干活所能學到的.
            • 每天看一些文章. www.codeproject.com msdn.microsoft.com 上 有幾千篇的文章你可以看. 如果你每周看10篇文章, 這樣堅持一年, 你就有480篇文章的知識量啦! 那時候誰能有你牛B?
            • 不僅文章要讀, 它附帶的源代碼你最好也看看. 寫一些類似的項目并且在你自己的項目中嘗試一下這些文章中的方法. 我每天都會花1小時來嘗試一些新的技術. 這不僅增加了我的知識還讓提高了我的動手能力, 讓我在平時的工作中做的更好還更有效率.
            • 去一個讓你有激情, 而且可以讓你做各種不同的事情的公司工作. 例如它能讓你自由去設計你自己的模塊, 開發, 測試, 編撰文檔等. 這個過程讓你可以經理軟件開發的整個階段. 然后要確定你的公司里有足夠的比你還牛B的人來讓你去學習他們. 否則你只是一個大奶牛場的另外一頭奶牛而已, 你什么也得不到.
            • 別以為你好像做了很多但只得到一點點薪水就離開一個公司. 要有耐心. 好好干, 總有一天你會得到你應得的. 曾經我在我的第一個公司做一個美國大公司的外包項目, 我一個月才拿250美元. 在那個公司的7年中, 我一共做了8個項目. 但我并沒有因此而離開那個公司, 只是因為我可以在那里學和做很多東西. 特別是在那里我可以用到很多種不同的技術. 但當我終于離開的那家公司并加入的另外一個, 由于我在前一個公司學到了大量的東西, 我在新公司里的薪水是每天200美元. 看到不同了么? 如果當時我離開了前面的那個公司而只圖一個稍微高一點的薪水, 我不可能學到那些那么Cool的東西, 而且我也不會像現在一樣有錢.
            • 下面是對那些現在已經每天掙200美元的人說的, 很重要: 即使你已經賺了那么多錢也不要改變你自己, 依然做當年每月掙200塊的你. 記住, 就是當時的那種態度和你不斷燃燒的學習欲望才讓你像現在這樣. 如果你心中的學習欲望再也不燃燒的時候你只會變成一根燒盡的蠟燭, 你掛了.
            • 別去那種有很好的職責劃分的公司里開始你的事業, 在那種公司里, 也許你只要叫你手下的那些程序員去決定所有的輸入/輸出/偽代碼, 你有一個固定的QA(質量評價)團隊去測試, 你還有一隊經理和管理員去關心每個管理和操作的問題, 等等. 在那種公司里, 你只是一個"聰明的打字員"而已. 你只是簡單的把英語翻譯成C#. 你的右腦根本沒有在動. 去一個有很多挑戰并且有很多機會你可以開動大腦和動手的小公司工作吧, 燒焦的大腦的味道總比那些從華麗裝修的Office中的小格子的味道好.
            • 在我那么多次的的面試里, 我已經看到了一個開發者進化的過程, 看看自己屬于哪一類:
              • 初學者: 他們沒沒穿皮鞋, 穿著涼鞋, 看上去很鎮定. 襯衫在褲子外面. 當你問他, 你知道.NET事件和代理么? 他們說: "呃, 嗯.... 不, 我好像不知道, 跟生日事件有關么?"
              • 初學者+: 無論你問什么關于編程的問題, 他總是回答"我全都知道". 他們穿著亮堂堂的鞋子, 長袖的襯衫很漂亮的扎在褲子里. 整齊的頭發上搽著"Set Wet"的發膠, 帶著價值300美元的太陽眼鏡. 當你問他: "你知道什么是.NET事件和代理么?" 他們說: "事件和代理實在是太COOOOL了! Man~ 你到處都可以用它, 注意了老兄~   是"到處"! 我在那~~~么多的項目中都用了~ 難道你只學了.NET事件和代理么?"
              • 中級: 衣著稍微有些低調, 太陽鏡是老款的. 沒有發膠. 只要你一提到一些關于EJB, Spring, 設計模式之類的問題, 他們的眼睛就會像11月的天空中最亮的星星一樣發光. 他們開始可以在辦公室做些自由的事情, 開始去一些在線論壇, 和朋友一起做些開源的項目, 也開始看MSDN Magazine. 但你一問他: "你能干么?" 他們總是回答: " 當然~ 你明天就可以拿到." 但一般他們會在一個月后做完.
              • 中級+: 一般你會看到他們比計劃晚1~2個星期做完.
              • 高級: 他們總是每天都穿著帶有"I am a Geek"或者"Microsoft Windows Xp"標志的T恤(直到穿到發臭, 而且當他們進入辦公室你可以聞到), 穿著光亮的運動鞋. 他們開始談論一些軟件開發過程, RUP, 極限編程, 敏捷編程等等. 當你要他們做些事情, 他們回答: "給我一個功能規范, 技術規范, 測試方案, Milestone, 發布計劃, Mockup, 還有N個程序員, 我就能做完了"
              • 相當高級: 他們沒沒穿皮鞋, 穿著涼鞋, 看上去很鎮定, 襯衫在褲子外面. 當你問他: "你知道.NET事件和代理么?" 他們回答: " 事件和代理總是會造成雙向的強引用, 導致GC無法收集事件監聽者屬性, 唯一能釋放這個引用的方法就是關閉這個AppDomain."
            • 如果你在考微軟認證的時候不作弊, 你可以學到很多
            • 寫一些文章或者Blog, 共享你所學到的. 哪天也許誰就會從你的文章中獲益. 不要猶豫, 覺得你懂的不多而不去寫.

            posted @ 2010-07-02 12:55 eircQ 閱讀(842) | 評論 (0)編輯 收藏

                無論做什么,你只要靜心研究,堅持下去,都會有一番作為。
                但我有時候覺得,選擇,決策更加重要。當你的方向是正確的時候。你走下去的路會更加平坦。更加容易。
            如果選擇錯誤,那么你的路就會越走越窄。最后走向失敗。
                作最有價值的事情才是你努力的方向。

                ADOBE創造了FLASH,然后你卻只是做FLASH 的工具,那么你就將要落后。

                M8生產手機,我覺得不是一件很明智的選擇。

            posted @ 2010-06-25 14:03 eircQ 閱讀(126) | 評論 (0)編輯 收藏

              如果定義了UNCODE,TCHAR 變為wchar.如果沒有定義,那么TCHAR 變為char.
                寬字符應該這樣定義。L"sdfdf";

                T  中間類型。如果定義了 _UNICODE,則T表示W;如果定義了 _MBCS,則T表示A.
                A  ANSI 字符串,也就是 MBCS.
                C  const 的縮寫.

              VARIANT 跨語言類型
                VARIANT v;
                v.vt=VT_BOOL,v.boolVal=VARIANT_TRUE;
              VARIANT 現成的包裝類 CComVariant、COleVariant、_variant_t
                CComVariant v1("ssd");CComVariant v2(true);CComVariant_t(100);

                BSTR是指向unicode的字符串指針。BSTR bb=::SysAllocString(L"Hello world");
                ATL中BSTR的包裝類CComBSTR;

                在Windows Data Type中,LPSTR這樣定義的,typedef CHAR * LPSTR.

              之間主要的轉換char *,BSTR,_variant_t;
                _variant_t類 中有一個函數SetString(const char*),就是把char* 轉換為BSTR,然后轉換為_variant_t.

            posted @ 2010-06-24 21:43 eircQ 閱讀(876) | 評論 (0)編輯 收藏

            僅列出標題
            共4頁: 1 2 3 4 
            久久99国内精品自在现线| 亚洲国产小视频精品久久久三级| 久久精品国产2020| 久久久久久久久波多野高潮| 国产高潮国产高潮久久久| 久久99热精品| 伊人久久大香线蕉av一区| 91亚洲国产成人久久精品网址| 亚洲精品tv久久久久久久久久| 色88久久久久高潮综合影院| 国内精品伊人久久久久网站| 亚洲AV日韩精品久久久久| 精品久久久久久无码免费| 99久久国产宗和精品1上映 | 亚洲国产精品成人AV无码久久综合影院| 色综合合久久天天给综看| 国内精品伊人久久久久av一坑| 伊人色综合久久天天人守人婷| 久久人人妻人人爽人人爽| 一本大道久久香蕉成人网| 国产日产久久高清欧美一区| 亚洲国产精品无码久久SM| 亚洲午夜无码AV毛片久久| 久久精品无码免费不卡| 久久电影网一区| 97精品国产91久久久久久| 一本色综合网久久| 久久亚洲精品无码aⅴ大香| 午夜精品久久久内射近拍高清 | 亚洲综合精品香蕉久久网97| 久久国产免费直播| 综合久久一区二区三区| 欧美性大战久久久久久| 久久人人爽人人爽AV片| 久久精品免费大片国产大片| 日本久久久久久中文字幕| 久久99精品综合国产首页| 91久久精品国产成人久久| 丁香五月综合久久激情| 欧美久久一级内射wwwwww.| 国产综合精品久久亚洲|