기본 콘텐츠로 건너뛰기

Doxygen - Visual Studio 6.0 에서 Doxybar쓰기

출처 Seize the day | 더미
원문 http://blog.naver.com/pokev25/80001993980
참조 URL - http://www.gpgstudy.com/gpgiki/DoxygenTutorial

1. 필요파일 다운로드
2. 설치
    Doxygen과 help workshop은 setup진행
    Doxybar는 적절한 위치에 압축을 풀어 놓는다.
    (위의 참조 URL에선 path설정이 필요하지만 setup을 한경우는 자동 설정된다.)    
3. 환경설정
    Doxygen - 기본 설정파일을 만들자 도스창을 열고
    doxygen -g
    기본파일 (doxyfile)이 생긴다 boxybar설정할때 필요하므로 doxygen폴더에 넣어두자
    노트패드 같은것으로 이 파일을 열어서 OUTPUTLANGUAGE를 Korean으로 고친다.
    Doxybar - 퍼온다. 필요한 부분만 코멘트 처리함

    Installation

      Do the following to install the tool:
      • Start developer studio.
      • From the "Tools" menu select "Customize...".
      • Select the "add-ins and Macro Files" tab.
      • Press "Browse" and select files of type "add-ins (.dll)".
      • Browse to the location of doxbar.dll and press "open".
      • The config menu should now look like this:
        addin.png
      • Press "Close".
      • A new toolbar should appear:
        toolbar.png
      • From the "Tools" menu select "Customize..." again.
      • Select the "Tools" tab and add a new item to the list called doxygen.
      • Set the options as follows:
        config.png
        The batch file after command does not need to exist.
        It will be generated by DoxBar.
        To avoid a warning from developer studio you could create an empty batch file with that name, but make sure it is writable.
        For a convenient output, do not forget to check the Use Ouptut Window checkbox.
        - 이그림대로 설정하면된다. bat파일은 자동으로 생성된다. 에러나와도 아니오 누르면된다.
      • Press "Close".
      • Select the "Tools" menu again and remember the number of the user tool called doxygen. For a freshly installed developer studio it should be 6 or 7:
        menu.png
        -환경마다 다를것이다 몇번째인지 확인하자 아이콘옆에 숫자가 있다.
      • Press the configure button of the DoxBar add-in ()
      A configuration menu like the following should appear:
      • In the "User tool" tab, fill the edit control with "UserTool<number>", where <number> should be the remembered number (e.g. 7).
        configdialog-usertool.png
        - 위에서 확인한 숫자대로 써 넣는다.
      • In the "File locations" tab
        configdialog-filelocations.png
        -설치된 위치를 지정해주자
      • For the "Batch file" fill in the same path and file as you did in the configure menu.
      • Fill in (or browse to) the location of the doxygen executable.
      • At the "Configuration template" field you may fill in (or browse to) a Doxygen configuration file.
        The settings in this file will be used as a template for the DoxBar tool.
        Some options (like INPUT) will be overwritten.
        You can run doxygen with the -g option to generate a template configuration file which you may want to place in a template subdirectory.
        If you lieve this field blank, you will be asked if you want to create one the first time you execute doxbar on the active project.
      • Fill in (or browse to) the location of the HTML help compiler (this comes with the HTML Help workshop).
      • In the "Help invokation" tab, fill in the informations according to the description done in the Using the HELP feature section
      • In the "Auto comment" tab
        configdialog-autocomment.png
        Indicate the path to the place of common comment templates.
        Please refer to Using the Auto Comment feature section for details
      • Press "Ok". All settings will be stored in the system's registry.
      4. 자 이제 기본설정은 끝났다.
      사용해보자.

      프로젝트를 열고 적절한 주석기호를 사용해서 코멘트를 달면된다.
      5. 프로젝트마다 doxygen의 옵션을 따로 설정 가능하며 doxybar 툴에서 옵션을 설정한다.
      JAVADOC_AUTOBRIEF, DETAILS_AT_TOP을 개인적으로 사용하며 각종 Output 탭에서 사용할 output만 설정한다.
      ............................
      자..그런데..클래스 다이어그램이라던지 그런 그림을 어디선가 본듯하고 넣고 싶다면???
      doxygen메뉴얼을 열어보면  Graphics and diagrams항목이 있다 이대로 설정하자.

      다운로드 - http://www.research.att.com/sw/tools/graphviz/
      에서 다운받아 설치 하고 HAVE_DOT을 설정하면 그래프를 그려준다.
      .................................
      이전 버전의 doxygen의 경우 헤더파일에 모든 주석을 달아야 해서 기피했었는데
      언제부터인제 .cpp에 주석을 해도 정리를 해주어서 무척이나 편리했다.
      /// 이렇게 주석을 달면 doxygen에서 문서화에 포함된다.

      /**
      */ 의 javadoc스타일도 있고 메뉴얼을 참조하기 바란다.
      ......................
      http://board6.superboard.dreamwiz.com/board.cgi?db=31_canprog&action=list&no=57&page=1
      유용한 팁인것 같아서 무단 복제 한다. ^^;;

      Doxygen 사용기 및 팁

      주로 C를 사용하느라 몇주전 Doxygen이라는 다큐먼트 프로그램을 사용해봤는데 좀 괜찮은거 같아서 소개해봅니다.
      Doxygen이 모냐면, 그냥 프로그램 소스 문서화 프로그램이라고 보심 될겁니다.
      chm파일까지 만들어줘서 홀랑 반해버렸지요
      독시젠이 뭔지 어케 돌아가는건지등의 원론적인 내용은 알아서들 찾아보시고
      주로 사용하는(주로라기보다 요것밖에 없는) 비주얼씨 6 에서의 사용법과 팁들을 위주로 말하겠슴다.

      자바에선 Javadoc이란게 있다 하는데 이런류의 프로그램을 처음 접해봐서 대충 머릿속에 떠오르는것만 예기 해볼랍니다.
      체질이 야메라
      정석 사용법은 홈페이지를 참고하세요..
       (1) 파일 디스크립션(용어가 참 부적절하네 -_-  .. 브리핑이라고 해야하나)
      /** \file <파일이름>
                     \brief <브리핑>
                     \author <제작자>
                     \warning <경고성 멘트>
                     \version <버전>
                     \date <날짜>  
      */
                 
       (2) 함수 디스크립션
      /** \fn <함수 이름>
                     \brief <브리핑>
                     \param <파라메터 설명>
                     \return <리턴값 설명>
                     \sa <See also 함수 링크>
                     \warning <경고성 멘트>
                     \date <날짜>
      */
                 
       대충 주로 사용되는 부분이라 생각되어 요것만 해봤슴다.
       #define 이나 그외 다른것들은 그냥 위에다가 /** */ 한줄써주면 되니깐 걍 알아서들 하시고
       
       
       귀차니즘을 없애기 위해 비주얼씨에 매크로를 만들어봅시다.
       
      3. 매크로 만들기
       다음은 그냥 매크로를 만들어본건데요,
       대충 기본적인 매크로좀 보고 구성좀 바꾸어봤는데 매크로 쓰는법도 설명을 해볼께요
       
       Tools메뉴에 Macro라는 걸 선택하믄 매크로 창이 뜹니다.
       요기서 Edit버튼을 누르면 함수 이름과 설명을 넣으라는데 대충 처넣구
       vb문법이 적용된 소스 한장이 나옵니다. 대충 다음을 붙여넣기 해서 매크로를 등록하믄 됩니다.
       
       다음은 독시를 쓰기위해 만들어본 간단한 샘플입니다.
       
       으으으 역시나 주석 부분때문에 보기가 어렵군요  

      Sub AddDoxyDocument()
             str =           "//************************************************************* Doxygen Style **" + _
                 vbLf + "/** \file " + ActiveDocument.Name + _
                     vbLf + "*   " + _
                     vbLf + "*   Project Name        : <프로젝트> " + _
                     vbLf + "*   " + _
                     vbLf + "*   \brief              : <여기 브리핑>" + _
                     vbLf + "*   " + _
                     vbLf + "*   \author             : <이름>" + _
                     vbLf + "*   " + _
                     vbLf + "*   \warning            : <Warning>" + _
                     vbLf + "*   " + _
                     vbLf + "*   \version            : <Ver>" + _
                     vbLf + "*   " + _
                     vbLf + "*   \date               : " + CStr(Now) + _
                     vbLf + "*   Last Update date    : " + _
                     vbLf + "*   " + _
                     vbLf + "*/" + _
                     vbLf + "//******************************************************************************" + vbLf
             ActiveDocument.Selection = str
      End Sub
      
      
      
      'Strips the leading tab spaces.
      Function StripTabs (ByVal MyStr)
             Do While InStr(MyStr, vbTab) <> 0
                     MyStr = Right(MyStr, Len(MyStr) - InStr(MyStr, vbTab))
             Loop
             StripTabs = Trim(MyStr)
      End Function
      
      Dim ParamArr ()  ' Dynamic array to store function arguments.
      
      Sub AddDoxyFunction()
      
             ' 선택된 스트링을 얻어온다.
             if ActiveDocument.Language = dsCPP Then
                     Header = StripTabs(Trim(ActiveDocument.Selection))
      
                     HeadName = Header
      
                     ' 리턴값을 얻는다.
                     if Header <> "" then                                                                                        ' 선택된 문장은 공백이 아니다.
                             Reti = InStr(Header, " ")                                                                        ' Header에서 " "을 찾는다.
                             Loc = InStr(Header, "(")                                                                        ' Header에서 "("를 찾는다.
                             if Reti < Loc Then                                                                                ' " " 이 "(" 전에 나타났다면 올바른 리턴값이다.
                               RetTp = Left(Header, Reti)                                                                        ' RetTp는 왼쪽에서 " "가 나타났을때까지다.
                               Header = Right(Header, Len(Header) - Reti)                                                        ' Header는 리턴값부분을 뺀다.
                             End If
      
                             ' 함수 이름을 얻는다.
                             Loc = InStr(Header, "(") - 1                                                                        ' "(" 를 찾는다.
                             Loc2 = InStr(Header, ")")                                                                        ' ")" 를 찾는다.
                             if Loc > 0 And Loc2 > 0 then '                                                                        ' "(" 와 ")" 가 모두 발견 되었다면
                                     fcName = Left(Header, Loc)                                                                ' fcName은 왼쪽에서 "("가 나타나기 전까지이다.
                                     Header = Right(Header, Len(Header) - Len(fcName))                                        ' Header는 fcName을 잘라낸다.
      
                                     '  Do we have storage type on the return type?
                                     Trim (fcName)
                                     If InStr(fcName," ") <> 0 Then
                                             retTp = retTp + Left(fcName,InStr (fcName," "))
                                             fcName = Right(fcName, Len(fcName) - InStr(fcName," "))
                                     End If
      
                                     ' 함수의 파라메터를 얻는다.
                                     iPrm = 0
                                     iPrmA = 0
                                     prms = Header
      
                                     ' 파라메터의 갯수를 얻는다.
                                     Do While InStr(prms, ",") <> 0                                                                ' "," 문자를 찾는다.
                                             iPrm = iPrm + 1                                                                        ' "," 의 갯수를 센다.
                                             prms = Right(prms, Len(prms) - InStr(prms, ","))
                                     Loop
                                     
                                     ' 파라메터 리스트를 배열에 넣는다.
                                     If iPrm > 0 Then                                                                        ' 파라메터가 1개 이상이면
                                             iPrm = iPrm + 1
                                             iPrmA = iPrm
                                             Redim ParamArr(iPrm)                                                                ' ParamArr을 선언한다.
                                             Do While InStr(header, ",") <> 0                                                        ' "," 를 찾는다.
                                                     ParamArr(iPrm) = Left(Header, InStr (Header, ",") - 1)                        ' "," 이전까지 선택한다.
                                                     'Remove brace from first parameter.
                                                     If InStr(ParamArr(iPrm), " (") <> 0 Then                                ' " (" 가 발견되면
                                                             ParamArr(iPrm) = Right(ParamArr(iPrm), _
                                                                     Len(ParamArr(iPrm))-InStr(ParamArr(iPrm)," ("))        '
                                                             Trim(ParamArr(iPrm))                                                                '
                                                     End If
                                                     Header = Right(Header, Len(Header) - InStr(Header,","))                        ' "," 찾았을때까지의 문자를 뺀다.
                                                     iPrm = iPrm - 1
                                                     Loop
                                             ParamArr(iPrm) = Header
                                             'Remove trailing brace from last parameter.
                                             If InStr(ParamArr(iPrm), ")") <> 0 Then
                                                     ParamArr(iPrm) = Left(ParamArr(iPrm), _
                                                                     InStr(ParamArr(iPrm), ")") - 1)
                                                     Trim(ParamArr(iPrm))
                                             End If
                                     Else 'Possibly one param.
                                             Redim ParamArr(1)
                                             Header = Right(Header, Len(Header) - 1) ' Strip the first brace.
                                             Trim(Header)
                                             ParamArr(1) = StripTabs(Header)
                                             If InStr(ParamArr(1), ")") <> 1 Then
                                                     ParamArr(1) = Left(ParamArr(1), InStr(ParamArr(1), ")") - 1)
                                                     Trim(ParamArr(1))
                                                     iPrmA = 1
                                             End If
                                     End If
      
                                     'Position the cursor one line above the selected text.
                                     ActiveDocument.Selection.LineUp
                                     ActiveDocument.Selection.LineDown
                                     ActiveDocument.Selection.StartOfLine
                                     ActiveDocument.Selection = vbLf
      
                                     Descr =                "// ======================================== Doxygen Style ==" + _
                                             vbLf +        "/** \fn " + HeadName + _
                                             vbLf +        "    \brief <여기에 브리핑> " + vbLf
                                     'Print the parameter list.
                                     Last = iPrmA
                                     Do While iPrmA <> 0
                                             'Remove a line feed from any of the arguments.
                                             If InStr(ParamArr(iPrmA), vbLf) <> 0 Then
                                                     ParamArr(iPrmA) = Right(ParamArr(iPrmA), _
                                                                     (Len(ParamArr(iPrmA)) - _
                                                                     InStr(ParamArr(iPrmA), vbLf)))
                                                     Trim(ParamArr(iPrmA))
                                             End If
                                             ParamArr(iPrmA) = StripTabs(ParamArr(iPrmA))
                                             'If there are 2+ parameters, the first parameter will
                                             'have a '(' prepended to it, remove it here:
                                             if iPrmA = Last AND Last <> 1 then
                                               ParamArr(iPrmA) = Right(ParamArr(iPrmA), _
                                                             Len(ParamArr(iPrmA)) - 1)
                                             End If
                                             Descr = Descr +                "    \param " + ParamArr(iPrmA) + " : <여기 브리핑>" + vbLf
                                             iPrmA = iPrmA - 1
                                     Loop
      
                                     Descr = Descr + vbLf +        "    \return <여기 리턴 브리핑>" + _
                                                                     vbLf +        "    \sa <여기 See Also>" + _
                                                                     vbLf +        "    \date " + CStr(Now) + _
                                                                     vbLf +        "*/" + vbLf + _
                                                                     "// =========================================================" + vbLf
                                     ActiveDocument.Selection = Descr
                             Else
                                     MsgBox("It is possible that the function you are trying to"+_
                                                     " work with has a syntax error.")
                             End if
                     End If
             Else
                     MsgBox("You need to have an active C/C++ document open"+ _
                                     vbLF+"with the function prototype selected.")
             End If
      
      End Sub
                 

      그냥 시간나서 간단하게(?) 만들어봤슴다.

      매크로에 대한건 알아서들 하시고

      또 중요한건 단축키를 이용해 사용을 하니 온갖 귀차니즘이 다 날라가는 기분을 느꼈는데요

      요것두 설명을 드리죠.

      Tools메뉴에 Macro를 누르면 매크로 창이 뜨죠,  Option >> 을 누르면

      Keystrokes 를 누르면 매크로 함수에 대해 단축기 지정이 나온답니다.

      저는 왠만한건 매크로를 해놓느라 단축기 자리가 없어 Doxygen에 대한건 Ctrl+D Ctrl+D나 Ctrl+D Ctrl+F 등을 정해놓구

      필요할때마다 Ctrl + D D, Ctrl + D F 등을 눌러가며 사용하구 있지요..

      독시에 대한 내용은 별로 없고 매크로 예기로 어느새 흘러가버렸군요..

      그냥 유용한 팁같아 적어봤습니다.

      대충 1시간만의 날림으로 적는 글이라 앞뒤도 안맞을꺼구 오류도 많을 것입니다.

댓글

이 블로그의 인기 게시물

80040154 오류로 인해 CLSID가 {xxxx-...}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.

원문보기 .NET 으로 만든 응용프로그램에서 com 객체를 호출한 경우 Windows7 64bit 에서 제목과 같은 에러가 발생했다. Win32 COM 과 .NET 프로그램간의 호환성 때문에 생긴 문제였다. 원인은 .NET 실행시 JIT 컴파일러에 의해 최적화된 기계어로 변환되기 때문.. Win32 COM은 컴파일시.. Win32 COM에 맞춰 빌드 속성에서 하위버전으로 맞춰 컴파일을 다시하는 방법도 있지만 메인 프로젝트가 .NET이라면 참조되는 모든 프로젝트를 다 바꿔야할 노릇.. 또 다른 방법은 COM+를 이용하여 독립적으로 만드는 것이다. 분리시키는 방법은 아래 주소해서 확인할 수 있다. http://support.microsoft.com/kb/281335 나의 경우는 Win32 COM DLL을 64비트 .NET 프로그램에서 참조하니 COM 객체를 제대로 호출하지 못하였습니다. 그래서 .NET 프로그램의 Target Machine을 x86으로 설정하니 제대로 COM 객체를 호출하였습니다.

[Pyinstaller] 실행 파일 관리자 권한 획득하기

고객사에서 일부 사용자에게서 프로그램 오류가 발생한다며 아래와 같이 에러 캡처를 보내왔습니다. 프로그램에서 로그를 남기기 위해 로그 파일을 생성하는데 권한의 문제로 로그 파일을 생성하지 못해 프로그램 오류가 발생한 것 같습니다. 처음에는 Python 코드에서 관리자 권한을 요청하는 코드를 넣으려고 했는데, 실제로 Stackoverflow를 찾아보면 이런 내용이 나옵니다. 프로그램이 관리자 권한으로 실행되지 않았다면 관리자 권한으로 다시 프로그램을 실행시키는 코드입니다. import os import sys import win32com.shell.shell as shell ASADMIN = 'asadmin' if sys.argv[-1] != ASADMIN: script = os.path.abspath(sys.argv[0]) params = ' '.join([script] + sys.argv[1:] + [ASADMIN]) shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) sys.exit(0) 하지만 개인적으로 이런 방식은 마음에 들지 않았고 조금 더 찾아보니 Pyinstaller로 exe 파일을 만들 때 옵션을 설정하여 관리자 권한을 요청하도록 할 수 있다고 합니다. --uac-admin을 옵션에 추가하면 프로그램 실행 시 관리자 권한을 요청할 수 있습니다. pyinstaller.exe --uac-admin sample.py 하지만 안타깝게도 이 방식은 원하는 대로 동작하지 않았습니다. 마지막으로 manifest 파일을 이용하여 시도해보았습니다. spec 파일을 이용하여 pyinstaller로 빌드하면 <실행 파일 이름>.manifest 라는 파일이 생성됩니다. 파일에서 아랫부분을 찾아볼 수 있습니다. <security> <re

초간단 프로그램 락 걸기

프로그램에 락을 걸 일이 생겨났다. 하드웨어 락을 걸면 쉬울텐데 그 정도는 아니고 프로그램의 실행 날짜를 제한 해 달라고 한다. 그래서 파일(license.lic)을 가지고 락을 걸리고 결정을 했다. 요구 사항은 아래와 같다. 1. license.lic 파일이 없으면 프로그램을 실행 할수 없게 한다. 2. 지정한 날짜를 넘어서는 프로그램을 실행 할수 없게 한다. 3. 사용자가 시스템 날짜를 되돌렸을때 인식하여 프로그램을 실행 할수 없게 한다. 음.... 1.번 문제는 사용자가 프로그램을 실행하기 위해서 license.lic 파일을 받아야만 한다. license.lic 파일에는 최근 실행 날짜/종료날짜 이런식으로 적도록 한다.(물론 내용은 암호화 한다.) 최근 실행날짜는 프로그램이 실행때마다 업데이트 하도록 하고 시스템 날짜와 비교하여 시스템 날짜가 최근 실행 날짜보다 이전의 날짜면 시스템 날짜를 되돌렸다고 인식하도록 한다.(3.번 문제 해결) 시스템 날짜와 종료 날짜를 비교하여 시스템 날짜가 종료 날짜를 넘으면 프로그램을 실행 할수 없도록 한다.(2.번 문제 해결)