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

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            http://www.moon-soft.com/doc/7553.htm

            當(dāng)公司要求你用統(tǒng)一的格式寫(xiě)函數(shù)注釋時(shí),這個(gè)小東西也許可以幫些忙。



            ma2jun@sina.com



            設(shè)計(jì)目標(biāo):





            1. 自動(dòng)提取函數(shù)名稱;2. 自動(dòng)提取函數(shù)功能注釋(假設(shè)在頭文件中);3. 自動(dòng)列出參數(shù)列表;4.自動(dòng)提取返回值;5.自動(dòng)填寫(xiě)作者及日期(作者名稱可以設(shè)置)



            例如:



            //------------------------------------------------
            // 名稱:CDSAddIn::OnConnection
            // 功能:
            // 參數(shù):[IApplication* pApp] ---
            //?????? [VARIANT_BOOL bFirstTime] ---
            //?????? [long dwCookie] ---
            //?????? [VARIANT_BOOL* OnConnection] ---
            // 返回:STDMETHODIMP ---
            // 作者:麻軍? 2002-3-4
            //------------------------------------------------
            STDMETHODIMP CDSAddIn::OnConnection(IApplication* pApp, VARIANT_BOOL bFirstTime, long dwCookie, VARIANT_BOOL* OnConnection)



            設(shè)計(jì)思想:





            1. 使用IDSAddIn接口;2. 設(shè)計(jì)CCmtBlock(COMMENT BLOCK)類維護(hù)注釋中的各個(gè)字段,用來(lái)提供擴(kuò)展靈活性。



            實(shí)現(xiàn):



            //-----------------------------------------------------------------------------------------------------



            // CmtBlock.h: interface for the CCmtBlock class.
            //
            //////////////////////////////////////////////////////////////////////



            #if !defined(AFX_CMTBLOCK_H__51B4002A_A935_4764_80B5_03103D5E716E__INCLUDED_)
            #define AFX_CMTBLOCK_H__51B4002A_A935_4764_80B5_03103D5E716E__INCLUDED_



            #if _MSC_VER > 1000
            #pragma once
            #endif // _MSC_VER > 1000
            #include <vector>



            class CCmtBlock?
            {
            public:
            ?CCmtBlock();
            ?~CCmtBlock();



            private:
            ?CString m_szBegin;?????? // 注釋首行(hard coded)
            ?CString m_szName;??????? // 函數(shù)名稱(auto)
            ?CString m_szPurpose;???? // 函數(shù)功能(auto)
            ?CString m_szParam;?????? // 函數(shù)參數(shù)列表(auto)
            ?CString m_szReturn;????? // 函數(shù)返回(can change)
            ?CString m_szAuthor;????? // 函數(shù)作者(auto)
            ?CString m_szEnd;???????? // 注釋尾行(hard coded)



            ?CString m_szFuncDefine;? // 函數(shù)定義(自動(dòng)獲得)
            //?CString m_szBlock;?????? // 函數(shù)注釋塊



            ?std::vector< CString* > m_arrSort;? // 注釋部分的排列順序



            private:
            ?void ExtractName();????? // 提取名稱
            ?void ExtractPurpose();?? // 提取功能
            ?void ExtractParam();???? // 提取參數(shù)列表
            ?void ExtractReturn();??? // 提取返回類型
            ?void ComposeAuthorAndDate(); // 編輯作者和日期時(shí)間



            public:
            ?void SetFunctionDefine( CString szFuncDefine );?? // 設(shè)置函數(shù)定義(自動(dòng)獲得)
            ?CString ComposeComment();?? // 編輯函數(shù)注釋
            ?void SetPurpose( CString& szFuncPurpose ) {
            ??m_szPurpose = szFuncPurpose; }? // 設(shè)置函數(shù)頭文件中的注釋



            };



            #endif // !defined(AFX_CMTBLOCK_H__51B4002A_A935_4764_80B5_03103D5E716E__INCLUDED_)



            //-----------------------------------------------------------------------------------------------------



            // CmtBlock.cpp: implementation of the CCmtBlock class.
            //
            //////////////////////////////////////////////////////////////////////



            #include "stdafx.h"
            #include "AutoComment.h"
            #include "CmtBlock.h"



            #ifdef _DEBUG
            #undef THIS_FILE
            static char THIS_FILE[]=__FILE__;
            #define new DEBUG_NEW
            #endif



            //////////////////////////////////////////////////////////////////////
            // Construction/Destruction
            //////////////////////////////////////////////////////////////////////



            CCmtBlock::CCmtBlock()
            {
            ?m_szBegin = _T("http://------------------------------------------------\r\n");
            ?m_szEnd?? = _T("http://------------------------------------------------\r\n");



            ?m_arrSort.clear();
            ?m_arrSort.push_back( &m_szBegin );
            ?m_arrSort.push_back( &m_szName );
            ?m_arrSort.push_back( &m_szPurpose );
            ?m_arrSort.push_back( &m_szParam );
            ?m_arrSort.push_back( &m_szReturn );
            ?m_arrSort.push_back( &m_szAuthor );
            ?m_arrSort.push_back( &m_szEnd );
            }



            CCmtBlock::~CCmtBlock()
            {
            ?m_arrSort.clear();
            }



            void CCmtBlock::ExtractName()
            {
            ?int iPosSpace = m_szFuncDefine.FindOneOf(_T(" "));
            ?int iPosBracket = m_szFuncDefine.FindOneOf(_T("("));
            ?CString szName = m_szFuncDefine.Mid( iPosSpace, iPosBracket-iPosSpace );
            ?szName.TrimLeft();
            ?szName.TrimRight();
            ?m_szName = _T("http:// 名稱:") + szName + _T("\r\n");
            }



            void CCmtBlock::ExtractPurpose()
            {
            ?CString szTemp = m_szPurpose;
            ?m_szPurpose = _T("http:// 功能:") + szTemp + _T("\r\n");
            }



            void CCmtBlock::ExtractParam()
            {
            ?// 得到參數(shù)表
            ?int iPosLeftBracket = m_szFuncDefine.FindOneOf(_T("("));
            ?int iPosRightBracket = m_szFuncDefine.ReverseFind(_T(')'));
            ?CString szParamTable = m_szFuncDefine.Mid( iPosLeftBracket+1, iPosRightBracket-iPosLeftBracket-1 );



            ?// 分解參數(shù)
            ?// 判斷是否具有參數(shù)
            ?szParamTable.TrimLeft();
            ?szParamTable.TrimRight();
            ?if( szParamTable == _T("") )
            ?{
            ??// 沒(méi)有參數(shù)
            ??m_szParam = _T("http:// 參數(shù):無(wú)\r\n");
            ??return;
            ?}
            ?m_szParam = _T("http:// 參數(shù):");
            ?int iPos1 = 0;
            ?int iPos2 = 0;
            ?CString szOneParam = _T("");
            ?CString szOneLine;
            ?int iLineCount = 0;
            ?szParamTable += _T(",");
            ?while( ( iPos2 = szParamTable.Find( _T(','), iPos1 ) ) != -1 )
            ?{
            ??iLineCount++;



            ??// 找到參數(shù)
            ??szOneParam = szParamTable.Mid( iPos1, iPos2-iPos1 );
            ??szOneParam.TrimLeft();
            ??szOneParam.TrimRight();
            ??if( iLineCount == 1 )
            ???szOneLine = _T("[") + szOneParam + _T("] --- ");
            ??else
            ???szOneLine = _T("http://?????? [") + szOneParam + _T("] --- ");
            ??szOneLine += _T("\r\n");



            ??// 添加到函數(shù)列表上
            ??m_szParam += szOneLine;



            ??iPos1 = iPos2 + 1;
            ?}



            //?::MessageBox( NULL, szParamTable, NULL, MB_OK );



            }



            void CCmtBlock::ExtractReturn()
            {
            ?CString szRet = m_szFuncDefine.Mid( 0, m_szFuncDefine.FindOneOf( _T(" ") ) );
            ?m_szReturn = _T("http:// 返回:") + szRet + _T(" --- \r\n");
            }



            extern CString g_szAuthor;? // 作者名稱



            void CCmtBlock::ComposeAuthorAndDate()
            {
            ?CString szAuthor = g_szAuthor;//_T("Author");



            ?COleDateTime& date = COleDateTime::GetCurrentTime();
            ?CString szDate = date.Format( VAR_DATEVALUEONLY );



            ?m_szAuthor = _T("http:// 作者:") + szAuthor + _T("? ") + szDate + _T("\r\n");
            }



            void CCmtBlock::SetFunctionDefine( CString szFuncDefine )
            {
            ?m_szFuncDefine = szFuncDefine;
            }



            CString CCmtBlock::ComposeComment()
            {
            ?ExtractName();????? // 提取名稱
            ?ExtractPurpose();?? // 提取功能
            ?ExtractParam();???? // 提取參數(shù)列表
            ?ExtractReturn();??? // 提取返回類型
            ?ComposeAuthorAndDate(); // 編輯作者和日期時(shí)間



            ?CString szBlock = _T("");
            ?for( int i=0;i<m_arrSort.size();i++)
            ??szBlock += *m_arrSort[i];



            ?return szBlock;
            }

            //-----------------------------------------------------------------------------------------------------



            AutoCommentCommandMethod 函數(shù)是ADDIN向?qū)ё詣?dòng)建立的那個(gè)函數(shù)



            /////////////////////////////////////////////////////////////////////////////
            // CCommands methods



            STDMETHODIMP CCommands::AutoCommentCommandMethod()
            {
            ?AFX_MANAGE_STATE(AfxGetStaticModuleState());



            ?// TODO: Replace this with the actual code to execute this command
            ?//? Use m_pApplication to access the Developer Studio Application object,
            ?//? and VERIFY_OK to see error strings in DEBUG builds of your add-in
            ?//? (see stdafx.h)



            //?VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE));
            //?::MessageBox(NULL, "AutoComment Command invoked.", "AutoComment", MB_OK | MB_ICONINFORMATION);
            //?VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE));



            ?// 得到當(dāng)前文檔
            ?CComPtr<IDispatch> pDispActDocument = NULL;
            ?m_pApplication->get_ActiveDocument( &pDispActDocument );
            ?if( !pDispActDocument )
            ??return E_FAIL;
            ?CComQIPtr< ITextDocument, &IID_ITextDocument > pDoc( pDispActDocument );



            ?// 得到選擇對(duì)象
            ?CComPtr< IDispatch > pDispSelection;
            ?pDoc->get_Selection( &pDispSelection );
            ?if( !pDispSelection )
            ??return E_FAIL;
            ?CComQIPtr< ITextSelection, &IID_ITextSelection > pSelection( pDispSelection );



            ?// 得到函數(shù)定義(假設(shè)光標(biāo)插在函數(shù)定義中)
            ?//??? -- 尋找的標(biāo)志是:頭(NewLine),尾({)>> 將來(lái)實(shí)現(xiàn)
            ?// 選擇函數(shù)定義的第一行
            ?CComBSTR bstrFuncDefine;
            ?pSelection->SelectLine();
            ?pSelection->get_Text( &bstrFuncDefine );



            ?// 將光標(biāo)插入行的起始位置
            ?VARIANT var1,var2;
            ?VariantInit( &var1 );
            ?VariantInit( &var2 );
            ?pSelection->StartOfLine( var1, var2 );



            ?if( bstrFuncDefine.Length() == 0 )
            ??return E_FAIL;? // 不是函數(shù)定義
            ?USES_CONVERSION;
            ?CString szFuncDefine = W2A(bstrFuncDefine);
            ?m_CmtBlock.SetFunctionDefine( szFuncDefine );



            ?// 找到頭文件中函數(shù)定義的注釋
            ?CString& szFuncComm = FindFunctionPurposeInHeader( szFuncDefine );
            ?m_CmtBlock.SetPurpose( szFuncComm );



            ?// 構(gòu)成函數(shù)注釋字符串
            ?CString szBlock = m_CmtBlock.ComposeComment();
            ?BSTR bstrBlock;
            ?bstrBlock = A2W( szBlock );
            ?pSelection->put_Text( bstrBlock );



            ?return S_OK;
            }



            CString CCommands::FindFunctionPurposeInHeader( CString& szDefine )
            {
            ?CString szRet;
            ?// 得到當(dāng)前文檔
            ?CComPtr<IDispatch> pDispActDocument = NULL;
            ?m_pApplication->get_ActiveDocument( &pDispActDocument );
            ?if( !pDispActDocument )
            ??return "";
            ?CComQIPtr< ITextDocument, &IID_ITextDocument > pDoc( pDispActDocument );
            ?if( !pDoc )
            ??return "";



            ?// 得到函數(shù)名稱
            ?CString szFuncName;
            ?int iPosSpace = szDefine.FindOneOf(_T(":"));
            ?int iPosBracket = szDefine.FindOneOf(_T("("));
            ?szFuncName = szDefine.Mid( iPosSpace+2, iPosBracket-iPosSpace-2 );
            ?szFuncName.TrimLeft();
            ?szFuncName.TrimRight();



            ?// 打開(kāi)對(duì)應(yīng)的.h文件
            ?CComBSTR bstrFullName;
            ?pDoc->get_FullName( &bstrFullName );
            ?CString szFullName( bstrFullName );
            ?szFullName.MakeLower();
            ?CString szExt = szFullName.Right( 3 );
            ?if( szExt != "cpp" )?? // 不是.cpp
            ??return "";
            ?szFullName.TrimRight( "cpp" );
            ?szFullName += "h";? // 轉(zhuǎn)換成.h



            ?CStdioFile file;
            ?if( !file.Open( szFullName, CFile::modeRead ) )
            ??return "";
            ?CString szLine;
            ?CString szPurpose;
            ?int pos;
            ?while( file.ReadString( szLine ) )
            ?{
            ??// 檢查每一行是否有函數(shù)名稱
            ??if( (pos=szLine.Find( szFuncName )) != -1 )
            ??{
            ???// 檢查szFuncName的前后字符是否為空格and'('
            ???// 構(gòu)造一個(gè)字符串在szFuncName的前后個(gè)加一個(gè)字符
            ???CString szTemp = szLine.Mid( pos-1, szFuncName.GetLength()+2 );
            ???if( szTemp.Left(1) != " " ||
            ????( szTemp.Right(1) != " " && szTemp.Right(1) != "(" ) )
            ????szRet = "";
            ???else
            ???{
            ????// 找到函數(shù)聲明
            ????// 查看當(dāng)前行的末尾有沒(méi)有注釋
            ????int posSplash = 0;
            ????if( ( posSplash = szLine.ReverseFind( '/' ) ) != -1 )
            ?????szRet = szLine.Right( szLine.GetLength() - posSplash - 1 );
            ????else
            ????{
            ?????// 查看下一行有沒(méi)有注釋
            ?????if( file.ReadString( szLine ) )
            ?????{
            ??????szLine.TrimLeft();
            ??????szLine.TrimRight();
            ??????if( szLine.Left(1) == "/" )
            ??????{
            ???????// 有注釋
            ???????szLine.TrimLeft("http://");
            ???????szRet = szLine;
            ??????}
            ??????else
            ???????szRet = "";
            ?????}
            ?????else
            ??????szRet = "";



            ????}



            ???}
            ??}



            ?}
            ?file.Close();



            ?szRet.TrimRight();
            ?szRet.TrimLeft();
            ?return szRet;
            }


            //-----------------------------------------------------------------------------------------------



            // 在CDSAddIn::OnConnection函數(shù)中改寫(xiě)以下代碼,注意:CParamDlg 類是一個(gè)輸入作者名稱的對(duì)話框類



            ?if (bFirstTime == VARIANT_TRUE)
            ?{
            ??VERIFY_OK(pApplication->
            ???AddCommandBarButton(dsGlyph, bszCmdName, m_dwCookie));
            ??// 第一次使用讓用戶輸入姓名
            ??CParamDlg dlgParam;
            ??if( dlgParam.DoModal() == IDOK )
            ??{
            ???g_szAuthor = dlgParam.m_szAuthor;
            ???// 存入注冊(cè)表
            ???::WriteProfileString("DSAddIn_AutoComment","Author",g_szAuthor);
            ??}
            ?}
            ?else
            ?{
            ??char szAuthor[255];
            ??::GetProfileString("DSAddIn_AutoComment","Author","Author",szAuthor,sizeof(szAuthor));
            ??g_szAuthor = CString(szAuthor);
            ?}



            //-------------------------------------------------------------------------------------------------



            希望大家能提出寶貴意見(jiàn) :-)



            Ma Jun -----? ma2jun@sina.com? Jurassic xian corp.


            感謝Kamp Huang給這個(gè)東東找了個(gè)家:
            http://wsdnorgtypeb.51.net/kamp/zip/AutoComment.rar


            国产成人精品综合久久久| 久久99国产精品一区二区| 久久国产精品二国产精品 | 一个色综合久久| 伊人久久综合精品无码AV专区| 精品久久久久久无码专区不卡| 久久线看观看精品香蕉国产| 亚洲乱码日产精品a级毛片久久| 亚洲中文字幕无码久久2017| 久久青青草原精品影院| 久久久久久精品成人免费图片| 97热久久免费频精品99| 亚洲欧美日韩精品久久亚洲区| 精品久久久久香蕉网| 久久久国产精华液| 国产精品va久久久久久久| 久久精品无码专区免费青青| 亚洲人成无码www久久久| 99久久国产热无码精品免费久久久久| 亚洲精品无码久久久久AV麻豆| 久久亚洲国产中v天仙www| 亚洲AV无码久久寂寞少妇| 亚洲精品综合久久| 合区精品久久久中文字幕一区| 亚洲一区二区三区日本久久九| 久久综合精品国产二区无码| 久久丫忘忧草产品| 伊人精品久久久久7777| 国产精品青草久久久久婷婷| 久久水蜜桃亚洲av无码精品麻豆 | 国产精品一久久香蕉国产线看观看| 久久影视综合亚洲| 亚洲日韩欧美一区久久久久我| 久久精品国产一区二区| 精品久久久久久国产三级| 久久97久久97精品免视看| 国产精品成人99久久久久| 品成人欧美大片久久国产欧美| 久久综合久久综合久久综合| 亚洲国产成人久久综合碰碰动漫3d | 蜜臀av性久久久久蜜臀aⅴ|