320x100

Visual Studio Community 2013 무료화

Posted on 2015. 6. 11. 16:40
Filed Under Visual C++

작년, 2014년에 마이크로소프트의 CEO가 인도출신의 사티아 나델라(Staya Nadella) 로 바뀌었다고 한다. 

기사링크: http://www.wikitree.co.kr/main/news_view.php?id=158327

 

 

그러면서 Visual Studio Community 2013 무료버전을 내놓았고

https://www.visualstudio.com/products/visual-studio-community-vs

 

더불어 .NET을 오픈소스화 해서 리눅스와 Mac도 지원할 예정이란다. 홀~

https://github.com/dotnet/corefx

 

<정보출처: http://cafe.naver.com/gogoomas/308439>

 

 

아무튼

다운로드(vs_community.exe, 1.18MB) 받아서 설치를 해보았다. 

! 이 버전의 Visual Studio는 Internet Explorer 10 이상에서 가장 잘 작동합니다.

  컴퓨터에 Internet Explorer 10이 설치되어 있지 않은 경우 일부 기능이 정상적으로 실행되지 않을 수 있습니다.

 

뭐래니 -_-+++

차차 설치해서 사용해보아야겠다.

 

<정보출처: http://cafe.naver.com/gogoomas/308439>

 

PS.

IE10 미만 버전시 사용할 수 없다는 일부기능▶ https://support.microsoft.com/ko-kr/kb/2906882

얼추 검색해보니 왠만하면 IE10이상으로 업그레이드 하는 것이 정신건강에 좋을듯하다.

더불어 GUI버그가 있으니 서비스팩도 설치하라는 블로거의 권고를 보았다.


2016/07/05

○ Visual Studio 2013 버전 평가판: 다운로드


 

 

 

반응형

DC 개념

Posted on 2014. 1. 13. 09:44
Filed Under Visual C++


논리 좌표 : 윈도우즈의 내부에서 사용되는 좌표를 말한다. TextOut (100,100,...)에서 지정한 (100,100)이 곧 논리 좌표이며 논리 좌표의 실제 위치는 경우에 따라 달라진다. 그래픽 함수들이 사용하는 모든 좌표는 논리 좌표이며 좀 더 현실적으로 얘기한다면 DC핸들을 인수로 받아들이는 모든 함수는 논리 좌표를 사용한다.

물리 좌표 : 실제 화면에 출력되는 좌표이며 픽셀 단위를 사용한다. 물리적인 모니터의 픽셀이 단위이므로 물리 좌표 (100,100)은 그 위치가 정해져 있다. 윈도우를 관리하는 함수(또는 메시지) 에서 사용하는 좌표는 물리 좌표이다.

매핑모드: 논리 좌표를 물리 좌표로 변환하는 방법
-----------------------
SetWindowExtEx(x, y)
SetViewportExtEx(cx, cy)

참고: http://xuny.egloos.com/viewer/1426146

반응형

Window Message Processing

Posted on 2013. 5. 22. 13:23
Filed Under Visual C++

윈도우 프로그래밍 기본 지식!

 

http://heartcrack.tistory.com/82

 

반응형

윈도우 위치,크기 저장/복구

Posted on 2013. 5. 10. 16:05
Filed Under Visual C++

설명

CMainFrame에서 창크기를 제어한다.

저장은 CMainFrame::OnClose() 에서 하고

로드는 BOOL C******App::InitInstance() 에서..

 

소스

 

//아래는 MSDN에서 빼온 함수들. MainFrm.cpp에 추가

//////////////////////////////////////////////////////////////////
// Helpers for saving/restoring window state

static TCHAR BASED_CODE szSection[] = _T("Settings");
static TCHAR BASED_CODE szWindowPos[] = _T("WindowPos");
static TCHAR szFormat[] = _T("%u,%u,%d,%d,%d,%d,%d,%d,%d,%d");

static BOOL PASCAL NEAR ReadWindowPlacement(LPWINDOWPLACEMENT pwp)
{
    CString strBuffer = AfxGetApp()->GetProfileString(szSection, szWindowPos);
    if (strBuffer.IsEmpty())
        return FALSE;

    WINDOWPLACEMENT wp;
    int nRead = _stscanf(strBuffer, szFormat,
        &wp.flags, &wp.showCmd,
        &wp.ptMinPosition.x, &wp.ptMinPosition.y,
        &wp.ptMaxPosition.x, &wp.ptMaxPosition.y,
        &wp.rcNormalPosition.left, &wp.rcNormalPosition.top,
        &wp.rcNormalPosition.right, &wp.rcNormalPosition.bottom);

    if (nRead != 10)
        return FALSE;

    wp.length = sizeof wp;
    *pwp = wp;
    return TRUE;
}

static void PASCAL NEAR WriteWindowPlacement(LPWINDOWPLACEMENT pwp)
// write a window placement to settings section of app"s ini file
{
    TCHAR szBuffer[sizeof("-32767")*8 + sizeof("65535")*2];

    wsprintf(szBuffer, szFormat,
        pwp->flags, pwp->showCmd,
        pwp->ptMinPosition.x, pwp->ptMinPosition.y,
        pwp->ptMaxPosition.x, pwp->ptMaxPosition.y,
        pwp->rcNormalPosition.left, pwp->rcNormalPosition.top,
        pwp->rcNormalPosition.right, pwp->rcNormalPosition.bottom);
    AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
}

////////////////////////////////////////////////
//아래 두개의 함수를 만들어 주세요.

//아래는 복원, 저장 함수...둘다 public

void CMainFrame::SaveWindowPlacement()
{
    WINDOWPLACEMENT wp;
    wp.length = sizeof wp;
    if (GetWindowPlacement(&wp))
    {
        wp.flags = 0;
        if (IsZoomed())
            wp.flags |= WPF_RESTORETOMAXIMIZED;
        // and write it to the .INI file
        WriteWindowPlacement(&wp);
    }
}

BOOL CMainFrame::RestoreWindowPlaceMent()
{
    WINDOWPLACEMENT wp;
    if (ReadWindowPlacement(&wp)){
        SetWindowPlacement(&wp);
        return TRUE;
    }

    return FALSE;
}

//////////////////////////////////////////////////////////////
//사용예

//저장
void CMainFrame::OnClose() 
{
    // TODO: Add your message handler code here and/or call default
    //현재위치 저장하기
    SaveWindowPlacement();
    
    CFrameWnd::OnClose();
}

//복원.. 한글 주석이 달린곳만 보세요.
//CMainFrame에서 복원 작업을 하면 최대화 상태의 윈도우에서 문제가 있답니다.

BOOL C******App::InitInstance()
{
    AfxEnableControlContainer();

    // Standard initialization
    // If you are not using these features and wish to reduce the size
    //  of your final executable, you should remove from the following
    //  the specific initialization routines you do not need.

#ifdef _AFXDLL
    Enable3dControls();    // Call this when using MFC in a shared DLL
#else
    Enable3dControlsStatic();    // Call this when linking to MFC statically
#endif

    // Change the registry key under which our settings are stored.
    // TODO: You should modify this string to be something appropriate
    // such as the name of your company or organization.
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));

    LoadStdProfileSettings();  // Load standard INI file options (including MRU)

    //아래줄을 안해놓으면 깜빡일수 있다.
    this->m_nCmdShow=SW_HIDE;


    // Register the application"s document templates.  Document templates
    //  serve as the connection between documents, frame windows and views.

    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CDockingWndDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CDockingWndView));
    AddDocTemplate(pDocTemplate);

    // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);

    // Dispatch commands specified on the command line
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;

    // The one and only window has been initialized, so show and update it.
    //이전위치로 만들기.
    if (!((CMainFrame*)m_pMainWnd)->RestoreWindowPlaceMent())
        m_pMainWnd->ShowWindow(SW_SHOW);


    m_pMainWnd->UpdateWindow();

    return TRUE;
}

////////////////////////////////////////////////////////////////////////////////////////////

출처 - http://www.devpia.com/Forum/boardview.aspx?forumname=VC_LEC&no=2041

 

반응형

[CDC] DrawText 옵션 정리

Posted on 2013. 4. 23. 11:22
Filed Under Visual C++



DT_WORDBREAK ; 한글인경우 글자단위로 개행영문, 숫자인경우 단어단위로 개행

DT_EDITCONTROL : DT_WORDBREAK에 OR해주면 영문,한글,숫자 모두 글자단위로 개행

DT_NOFULLWIDTHCHARBREAK : 단어단위로 개행

DT_END_ELLIPSIS : 글자가 범위를 넘어가면 끝 부분을 '...'로 표시



UINT nFormat = DT_VCENTER|DT_CENTER|DT_SINGLELINE|DT_END_ELLIPSIS;

_pDC->DrawText((LPCTSTR)strText, &rectText, nFormat);


반응형

#pragma 에 대한 정리 [링크]

Posted on 2013. 4. 18. 13:20
Filed Under Visual C++

http://iprinceps.egloos.com/1334766 또는 http://ungvary.tistory.com/10



반응형

UNICODE와 MCBS

Posted on 2013. 4. 12. 11:02
Filed Under Visual C++

컨트롤에서 한글이 깨지는 문제시,

 

Multibyte와 UniCode의 차이점입니다.

Multybyte는 영문 1 byte, 한글 2byte를 씁니다.

그러나 UniCode는 영문한글 모두 2byte를 쓰지요.

 

이 때문에 각 컨트롤이 원하는 바를 맞추지 못하면 한글이 깨지게 된답니다.

 

대표적으로 pszText는 Multybyte 형태의 자료형입니다.

그에 비해 LPWSTR 는 Unicode지요.

 

프로젝트 생성 후 아무런 설정을 건드리지 않았다면 프로그램은 기본적으로

UniCode 로 작성하도록 합니다. (호환성에는 좋거든요.)

 

그러나 ListCtrl은 Multibyte를 사용합니다.

그 때문에 UniCode를 Multibyte로 바꿔서 값을 넣어줘야 합니다.
바꾸는 방법은


USE_CONVERSION; // A2W, W2A를 사용하기 위해 먼저 선언한다.


A2W ( Multy를 Unicode로)
W2A (Unicode를 Multy로)

를 사용하면 됩니다.


USE_CONVERSION;

CString strValue; // 프로젝트 설정에 따라 형태가 결정됩니다. 아마도 UniCode일 것입니다.

strValue.Format( _T( "%s" ), W2A(itemp));
 
출처: 네이버 지식IN

 

반응형

Visual C++ 컴파일러 버전 정보 및 활용 예

Posted on 2013. 4. 11. 18:07
Filed Under Visual C++

1100 : Visual C++ 5.0
1200 : Visual C++ 6.0
1300 : Visual C++ .NET
1310 : Visual C++ .NET 2003
1400 : Visual C++ .NET 2005
1500 : Visual C++ .NET 2008
1600 : Visual C++ .NET 2010
1700 : Visual C++ .NET 2012



활용 예:)
#if defined(_MSC_VER) && _MSC_VER > 1400 // VS2008 이후
...
#else
...
#endif
반응형

localization [미완성]

Posted on 2012. 8. 21. 16:26
Filed Under Visual C++

<개념알기>

http://includes.egloos.com/1506890

http://cafe.naver.com/newchany/623



<ANSI Code Page>

http://cafe.naver.com/devctrl/5761



// Locale ANSI code page Locale name

// Korean_Korea 949 ko-KR

// Japanese_Japan 932 ja-JP

// English (United States) 1252 en-US

//#include <locale.h>

#pragma setlocale(".932")


반응형

MessageBox 아이콘 모양.

Posted on 2012. 8. 17. 16:51
Filed Under Visual C++

출처: http://iq_up.blog.me/100125952192



::AfxMessageBox("AfxMessageBox(\"메시지\")");

유의: 아이콘에 대한 정의가 없으면 기본적으로 경고느낌표이다.

아래의 알림느낌표와 경고느낌표의 아이콘이 다름에도 유의하자.

- 정의하지 않거나,MB_ICONWARNING,MB_ICONEXCLAMINATION 이거나 3가지 경우이다.

 

::AfxMessageBox("MB_ICONHAND",MB_ICONHAND);


::AfxMessageBox("MB_ICONQUESTION",MB_ICONQUESTION);


::AfxMessageBox("MB_ICONEXCLAMATION",MB_ICONEXCLAMATION);



::AfxMessageBox("MB_ICONASTERISK",MB_ICONASTERISK);
알림 느낌표이다.

위의 경고느낌표와는 느낌이 조금 다르다.

Asterisk 는 별표이다. information으로 해도 된다.


::AfxMessageBox("MB_ICONWARNING",MB_ICONWARNING);

                                                         



::AfxMessageBox("MB_ICONERROR",MB_ICONERROR);



::AfxMessageBox("MB_ICONINFORMATION",MB_ICONINFORMATION);




::AfxMessageBox("MB_ICONSTOP",MB_ICONSTOP);

 



::AfxMessageBox("MB_ICONMASK",MB_ICONMASK);




::AfxMessageBox("MB_ICONMASK | MB_ABORTRETRYIGNORE",MB_ICONMASK | MB_ABORTRETRYIGNORE);


::AfxMessageBox("MB_DEFBUTTON3 는 3번째 버튼을 디폴트로 활성화 합니다.(1~3)",MB_ICONMASK | MB_ABORTRETRYIGNORE|MB_DEFBUTTON3


반응형

VC++ 개발 팁 [link]

Posted on 2012. 5. 22. 17:56
Filed Under Visual C++



http://pheadra.tistory.com/56


http://blog.daum.net/zzonzii/121


팁스소프트웨어 : http://www.tipssoft.com/bulletin/board.php?bo_table=update&wr_id=1082



반응형

char, wchar, TCHAR

Posted on 2010. 9. 14. 16:13
Filed Under Visual C++


어떠한 문자열을 처리하는 자료형은 보통 char, wchar, TCHAR 를 사용한다.
 
쉽게 보면,
char* => LPSTR 라고 생각하면 되고
const char* => LPCSTR 라고 할 수 있다.
 
가운데 'C' 는 const 의 의미다. 'LP' 는 long pointer 의 의미.
끝에 STR 이라는 의미는 NULL 포인터로 끝난다는 의미. 즉, 마지막 인덱스에는 항상 NULL 이 채워져 있어야 한다는 것.
그래야만 str 관련 함수들이 동작을 하는 것이다. strlen, strcpy, strcmp 등등.. 이것들이 src param 의 끝에 NULL 이 없으면 무지 당황하게 된다.
 
가운데 'T' 가 들어간다는 것은 TCHAR 이라는 의미.

그렇다면 왜 T를 쓸까??
 
영문은 1바이트.

그런데, 우리나라 말이나, 중국어 등 영문권이 아닌 제 3세계 언어를 표현하기 위해서는
2바이트가 필요하다.. 이를 위해서 MultiByte 를 사용하기도 하지만 MultiByte 는
어떤 글씨는 1바이트 이고 어떤 글씨는 2바이트여서 메모리 관리가 어렵다.
그래서 나온 것이 wchar 인데,

wchar 는 모든 글씨(영문 포함)가 2바이트로 구성이 된다.
당연히 wchar 는 일반 ascii 타입의 char 보다 메모리 공간이 2배 필요하다.
 
그런데 본론인 TCHAR 는 무엇이냐?
바로 ACSCII 타입의 일반 char 또는 wchar 라는 의미다.
TCHAR 을 사용하면 char 인지 wchar 인지 구별하지 않고 그냥 코딩을 하면 된다.
 
TCHAR tch = _T('A'); <=> char ch = 'A';
TCHAR tch = _T('A'); <=> wchar wch = 'A';
 
배열도 역시.. 그냥 숫자 인덱스로 원하는 글씨의 위치를 추적할 수 있다.
 
그럼 무엇으로 현재 프로젝트의 TCHAR가 char 인지 wchar 인지를 구별할까?
UNICODE 라는 precompile 상수.
 
해당 프로젝트 project -> settings 에 _DEBUG 등등 선언되어 있는데, 끝에다
UNICODE 라고 쓰고 컴파일 하면 앞으로 나오는 모든 TCHAR 타입은 wchar 으로 변환해서
컴파일을 시도하게 된다.
 
T 앞의 C 는 const 라는 의미
 
당연히 상수로 변환을 했으므로 변수에 값을 대입할 수 없겠다.
( b[3] = _T('A'); <- syntax error  <=> const char str = "ABCD"; str[3] = 'E' ; <- 이때 에러와 같은 이치)
 
(TCHAR 을 나타는 매크로가 _T 이다. (한문자 _T(' '), 문장 _T(" ") )

반응형

Visual SourceSafe 2005사용법

Posted on 2010. 5. 19. 16:57
Filed Under Visual C++


팀 개발 환경에서 Visual Studio .NET 사용

Mark White

Microsoft Corporation

요약: 이 문서에서는 팀 개발 환경에서 Visual Studio .NET 베타 2를 사용하는 방법에 대한 지침을 제공합니다. 동일한 프로젝트에서 여러 개발자가 함께 작업해야 하고 소스 제어를 위해 Visual SourceSafe가 사용된다고 가정합니다(15페이지/인쇄 페이지 기준).

목차

소개 소개
파일 공유 액세스 모드 설정 파일 공유 액세스 모드 설정
Visual SourceSafe에서 프로젝트 만들기 Visual SourceSafe에서 프로젝트 만들기
Visual SourceSafe에서 프로젝트 액세스 Visual SourceSafe에서 프로젝트 액세스
파일 수정 파일 수정
변경 내용 제공 변경 내용 제공
최신 버전 가져오기 최신 버전 가져오기
오프라인 작업 오프라인 작업
팁과 트릭팁과 트릭
Visual Studio .NET 베타 2 문제 Visual Studio .NET 베타 2 문제
요약 요약

소개

Microsoft® Visual Studio® .NET 베타 2에서 웹 응용 프로그램 팀 개발을 위해 권장되는 방법은 "파일 공유" 액세스 모드를 기준으로 합니다. 각 개발자는 자신의 가상 루트에 있는 파일 복사본에서 작업하지만 모든 사용자가 중앙 Microsoft® Visual SourceSafe® 프로젝트에서 파일을 체크 인/체크 아웃합니다. 이 방법은 고립화를 제공하므로 한 팀 구성원이 변경한 내용이 전체 팀의 작업 사본에 영향을 미치지 않습니다.

이 방법은 Microsoft® FrontPage® 웹 액세스를 사용하는 Microsoft® Visual InterDev® 6.0에 사용되는 방법과 다릅니다. 파일 공유 웹 액세스는 Visual Studio .NET 베타 2의 기본 액세스 모드이며 팀 개발에 사용하는 것이 좋습니다.

Visual SourceSafe 통합은 Visual Studio 6.0, Microsoft® Visual C++® 및 Microsoft® Visual Basic® 프로젝트에서 사용되는 것처럼 Visual Studio .NET에서 작업합니다. 개발자는 자신의 프로젝트를 로컬로 만들 수 있으며(http://localhost를 사용할 경우) 일반 Visual SourceSafe 프로젝트에서 체크 인/체크 아웃할 수 있습니다. 이 또한 팀의 모든 개발자가 중앙 서버에 있는 동일한 가상 루트에서 작업하는 Visual InterDev 6.0과 다릅니다.

이 문서에서는 웹 응용 프로그램의 개발에 대해 설명하고 있으나, 이 방법은 Visual Studio .NET 베타 2에서 웹이 아닌 응용 프로그램을 개발할 때도 동일하게 적용됩니다.

응용 프로그램을 개별 프로젝트로 적절히 분할하고, ASP.NET 사용자 컨트롤, HTTP 모듈 및 클래스 라이브러리를 사용할 때도 팀웍을 발휘할 수 있는 효과적인 방법으로 간주됩니다.

파일 공유 액세스 모드 설정

Visual Studio .NET 베타 2에서도 파일 공유는 기본 액세스 모드입니다. 액세스 모드가 올바르게 설정되었는지 확인하려면 Tools 메뉴에서 Options을 클릭하고 Projects를 클릭한 다음 Web Settings을 클릭합니다. 기본 설정 액세스 모드를 File share로 설정한 다음 OK를 클릭합니다. 이렇게 하면 웹 프로젝트를 Visual SourceSafe에 추가할 수 있습니다.

FrontPage 액세스 모드를 사용하는 기존 프로젝트가 있는 경우 해당 액세스 모드를 File share로 변경할 수 있습니다. Solution Explorer를 열고 해당 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 Properties를 클릭합니다. Common Properties를 클릭한 다음 Web Settings를 클릭합니다. 웹 액세스 모드를 File share로 설정한 다음 OK를 클릭합니다. 이제 솔루션을 저장하고 닫은 다음 다시 열어서 프로젝트 설정 변경을 적용해야 합니다.

이 문서의 나머지 부분에서는 파일 공유 액세스 모드를 사용하는 것으로 간주합니다.

Visual SourceSafe에서 프로젝트 만들기

첫째 팀 구성원은 하나 이상의 프로젝트가 포함된 솔루션을 만듭니다. (파일 공유 액세스를 사용하게 되면, 다른 시스템에 프로젝트를 만드는 경우 여전히 프로젝트 위치를 http://myserver와 같이 지정하지만, \\myserver\c$\inetpub\wwwroot 또는 \\myserver\wwwroot$로의 UNC(Universal Naming Convention)가 필요합니다.) 다른 팀 구성원이 작업을 시작할 수 있도록 솔루션이 준비되면 첫째 팀 구성원은 Solution Explorer에서 해당 솔루션이나 프로젝트 파일을 마우스 오른쪽 단추로 클릭한 다음 Add Solution to Source Control을 선택합니다. File 메뉴에서 Source Control을 클릭한 다음 Add Solution to Source Control을 클릭할 수도 있습니다.

솔루션에 파일 공유 액세스 모드를 사용하는 웹 프로젝트가 있는 경우 다음과 같은 경고가 나타납니다.

teamworvs1.gif

그림 1. 파일 공유 경고 대화 상자

이 경고는 무시해도 됩니다. Continue를 클릭합니다.

IDE(Integrated Development Environment)에서는 Visual SourceSafe 데이터베이스 서버를 묻는 메시지와 Visual SourceSafe에서 솔루션 파일과 솔루션의 개별 프로젝트를 저장할 위치를 지정하라는 메시지가 차례로 표시됩니다.

Visual Studio .NET에서의 기본 동작은 "Admin 사용자"를 사용하는 기본 Visual SourceSafe 데이터베이스(일반적으로 Common)에 사용자를 로그온하는 것입니다. 기본 사용자 이름과 암호는 Visual SourceSafe에서 제공합니다. 기본 Admin 사용자 암호는 비어 있기 때문에 솔루션을 Visual SourceSafe에 추가할 때 Visual SourceSafe 데이터베이스 서버를 묻는 메시지가 표시되지 않을 수도 있습니다. 대신 기본 Visual SourceSafe 데이터베이스에 자동으로 로그온하여 Add to SourceSafe Project 대화 상자로 바로 이동할 수 있습니다. 로그인 대화 상자는 기본적으로 화면에 표시됩니다. (베타 버전 6.0c를 비롯한 최신 Visual SourceSafe 버전에서는 로그인 대화 상자가 표시되지 않습니다. Visual SourceSafe 6.0c 최종판에서는 기본적으로 로그인 대화 상자를 표시합니다.)

이 문제를 해결하려면 Tools 메뉴에서 Options을 클릭하고 Source Control을 클릭한 다음 SCC Provider를 클릭합니다. 로그인 ID를 해당 사용자로 변경합니다. Advanced를 클릭하고 Integration 탭을 클릭합니다. Choose SourceSafe Database에서 Prompt를 선택합니다.

teamworvs2.gif

그림 2. Visual SourceSafe 프로젝트 추가

솔루션에 포함된 각 웹 프로젝트를 저장할 때도 Visual SourceSafe 위치를 제공하라는 동일한 대화 상자가 표시됩니다. 대화 상자가 처음 나타날 때 모든 프로젝트에 대한 위치를 지정하려면 솔루션과 같은 드라이브에 있는 비 웹 프로젝트의 Visual SourceSafe 위치를 해당 솔루션으로 설정합니다. 그 다음에 나타나는 대화 상자에서는 솔루션 내의 각 웹 프로젝트의 Visual SourceSafe 위치를 묻습니다. Visual SourceSafe에 특정 프로젝트를 추가하지 않으려면 Cancel을 클릭하고 Add selected projects to source control을 대신 선택합니다. 이 옵션을 선택하면 추가할 프로젝트를 제어할 수 있습니다. 소스 제어에 선택한 프로젝트를 추가하는 방법은 본 기사 후반부에서 설명합니다. Solution Explorer는 취소한 프로젝트를 체크 아웃된 것으로 표시하며, 프로젝트 파일은 Visual SourceSafe에 있지 않습니다. 이 시나리오에서 체크 아웃된 특수 문자는 Visual SourceSafe에 일시 보류 중인 추가 항목을 가리키는 데 사용됩니다.

Visual SourceSafe 위치를 설정할 때 솔루션 파일과 프로젝트를 동일한 Visual SourceSafe 폴더에 저장하거나 별도의 폴더에 저장할 수 있습니다. Visual Studio.NET이 모든 비 웹 프로젝트 교체를 제어하도록 하는 것이 바람직합니다. 그러나 프로젝트가 다른 웹 프로젝트와 충돌하지 않도록 하기 위해서는 각 웹 프로젝트가 해당 폴더에 놓여야 합니다. 보통 여러 프로젝트에 이름이 같은 파일(예: WebForm1.aspx)이 존재합니다. 한 Visual SourceSafe 폴더에 둘 이상의 프로젝트를 둘 경우, 파일 이름이 폴더에 이미 존재하면 그림 3의 대화 상자가 나타납니다.

teamworvs3.gif

그림 3. Visual SourceSafe 프로젝트에 중복 파일을 추가하려   표시되는 경고 대화 상자

Select different location을 클릭한 다음 앞에서 설명한 과정을 계속합니다.

Visual SourceSafe에 이미 추가된 솔루션에 Visual SourceSafe에 없는 기존 프로젝트나 새 프로젝트를 추가하려면 먼저 프로젝트를 솔루션에 추가하고, Solution Explorer에서 해당 솔루션을 마우스 오른쪽 단추로 클릭한 다음 다음 중 하나를 수행합니다.

  • Add를 클릭한 다음 New Project를 클릭합니다.

  • Add를 클릭한 다음 Existing Project를 클릭합니다.

Solution Explorer에 해당 프로젝트가 체크 아웃된 것으로 표시되지만 파일은 Visual SourceSafe에 없습니다. 이제 Solution Explorer에서 해당 프로젝트를 선택하고 File 메뉴에서 Source Control을 클릭한 다음 마지막으로 Add Selected Projects to Source Control을 클릭합니다. 앞에서 설명한 것처럼 Visual SourceSafe에서 프로젝트를 저장할 위치를 지정하라는 메시지가 표시됩니다. 비 웹 프로젝트의 경우에는 File 메뉴에서 Check In 명령을 사용하여 Visual Studio .NET이 Visual SourceSafe 위치를 제어하도록 하는 것이 좋습니다.

Visual SourceSafe에서 프로젝트 액세스

각 팀 구성원은 Visual Source Safe에서 프로젝트를 처음 액세스할 때 File 메뉴에서 Source Control을 클릭한 다음, Open Project From Source Control을 클릭해야 합니다.

그러면 IDE에서 팀 구성원에게 Visual SourceSafe 데이터베이스 서버를 묻는 메시지가 표시되고, 솔루션 파일과 비 웹 프로젝트를 복사할 로컬 폴더를 지정하라는 메시지와 Visual SourceSafe 프로젝트를 선택하라는 메시지가 표시됩니다. 그림 4의 예제 스크린샷에서는 MyWebProjects를 열고 솔루션 파일을 D:\Documents and Settings\marwhite\My Documents\Visual Studio Projects에 저장합니다.

teamworvs4.gif

그림 4. Visual SourceSafe 프로젝트에 대한 로컬 폴더 위치 설정

솔루션 파일은 기본적으로 C:\Documents and Settings\<사용자 이름>\My Documents\Visual Studio Projects에 복사됩니다. Tools 메뉴에서 Options을 클릭하고 Environment를 클릭한 다음 Projects and Solutions를 클릭하여 이 위치를 다시 구성할 수 있습니다.

솔루션 파일과 프로젝트 파일을 개별 폴더에 저장한 경우 다음 대화 상자가 표시되지 않지만, 동일한 Visual SourceSafe 위치에 저장한 경우에는 IDE에 솔루션 파일을 선택하라는 메시지가 표시됩니다.

teamworvs5.gif

그림 5. 솔루션 파일 선택

이 지점에서 솔루션에 하나 이상의 파일 공유 웹 프로젝트가 있으면 Set Project Location 대화 상자가 표시됩니다.

teamworvs6.gif

그림 6. Set Project Location 대화 상자

웹 프로젝트마다 이 대화 상자를 사용하여 격리된 웹 사이트의 위치를 선택해야 합니다. 웹 프로젝트를 서버(예: http://myserver/myproject_myroot) 또는 로컬 컴퓨터(예: http://localhost/myproject)에 저장할 수 있습니다. Visual Studio에서는 격리된 웹 프로젝트마다 가상 루트 하나를 만듭니다.

참고   앞에서 설명한 것처럼 처음에만 (File 메뉴에서 Source Control을 클릭하고 Open Project From Source Control을 클릭합니다.) 다음에 솔루션을 열 때는 로컬 디스크에 있는 솔루션 파일을 사용해야 합니다. 웹 서버나 Visual SourceSafe에서 응용 프로그램을 열지 마십시오.

Visual SourceSafe에 있는 기존 프로젝트를 솔루션에 추가하려면 File 메뉴에서 Source Control을 클릭하고 Add Project from Source Control...을 클릭합니다. IDE에 앞에서 설명한 대화 상자가 표시됩니다.

파일 수정

팀 구성원들은 코드 작업을 할 때도 일반 작업을 할 때처럼 작업합니다. 개발 환경에서는 파일을 수정하면 파일을 체크 아웃하라는 메시지가 자동으로 표시됩니다. 프로젝트에서 파일을 추가하고 제거하는 작업에는 프로젝트 파일 체크 아웃이 포함됩니다.

변경 내용 제공

팀에 새로 변경된 내용을 제공하려는 팀 구성원은 소스 코드를 변경하고 테스트한 다음 디버깅해야 합니다. 변경한 내용이 만족스러우면 파일을 선택하고 마우스 오른쪽 단추를 클릭한 다음 Check In을 클릭하거나, File 메뉴에서 Source Control을 클릭한 다음 Check In을 클릭합니다. 그러면 변경 내용이 Visual SourceSafe에 표시됩니다.

최신 버전 가져오기

팀의 최신 변경 내용을 가져오려는 팀 구성원은 Solution Explorer에서 솔루션 파일을 선택하고 마우스 오른쪽 단추를 클릭한 다음 Get Latest Version (Recursive)를 클릭해야 합니다. 응용 프로그램의 최신 버전을 생성할 경우에도 이 프로세스를 수행해야 합니다.

오프라인 작업

Visual Studio .NET 베타 2에서 제공하는 기능 중 Visual Studio .NET 베타 1에 비해 향상된 영역 중 하나는 오프라인 작업 기능입니다. 오프라인 작업은 많은 개발자들 특히, 많은 시간을 사무실 밖이나 여행을 하면서 보내야 하는 개발자들에게 중요한 시나리오입니다.

팀 구성원은 오프라인 작업을 사용하여 Visual SourceSafe와 통합된 솔루션 및 프로젝트를 오프라인으로 이동할 수 있습니다. 즉, 팀 구성원은 회사 네트워크과 Visual SourceSafe 데이터베이스로부터의 연결이 끊어진 상태로 파일을 체크 아웃할 수 있습니다. 팀 구성원은 사무실로 돌아와서 해당 솔루션과 프로젝트를 다시 연결하여 IDE에서 Visual SourceSafe 데이터베이스에 보관된 복사본과 자신의 복사본 간의 변경 내용을 동기화할 수 있습니다.

오프라인으로 이동

솔루션과 프로젝트를 오프라인으로 이동하려면 File 메뉴에서 Source Control을 클릭한 다음 Change Source Control을 클릭합니다. IDE에 다음 대화 상자가 표시됩니다.

teamworvs7.gif

그림 7. Visual SourceSafe에서 솔루션 프로젝트 연결/연결 끊기

솔루션과 프로젝트를 오프라인으로 이동하려면 Connected 확인란의 선택을 취소합니다.

오프라인으로 이동하기 전에 이미 체크 아웃된 파일은 체크 아웃된 상태로 유지됩니다. 데이터가 손상될 수 있는 환경을 피하려면 오프라인으로 이동하기 전에 오프라인에서 작업할 파일을 체크 아웃하는 것이 좋습니다.

오프라인에서 파일 체크 아웃

오프라인으로 작업하는 동안 파일은 일반적인 방법으로 체크 아웃됩니다. 오프라인에서 작업하는 동안 파일을 처음으로 체크 아웃하려고 하면 다음 대화 상자가 표시됩니다.

teamworvs8.gif

그림 8. 연결이 끊어진 동안 파일 체크 아웃

오프라인 체크 아웃을 사용하려면 그림 8의 대화 상자가 표시되지 않도록 해야 합니다. Don't show this dialog again을 선택한 다음 Check out (disconnected)을 클릭합니다. 그림 9에 나와 있는 것과 같이 다른 오류 대화 상자가 표시됩니다. 이 대화 상자는 무시해도 됩니다. OK를 클릭하십시오.

teamworvs9.gif

그림 9. 연결이 끊어진 동안 처음으로 파일을 체크 아웃할  표시되는 오류 대화 상자 

오프라인에서 작업하는 동안 파일을 다음에 체크 아웃하려고 하면 체크 아웃이 완료됩니다. 위에서 설명한 추가 오류 대화 상자는 RTM에 의해 표시되는 Visual Studio .NET 베타 2의 사소한 버그입니다.

팀 구성원이 오프라인에서 파일을 체크 아웃하면 체크 아웃된 파일에 대한 정보가 프로젝트의 일부로 저장되고 체크 아웃된 파일이 읽기/쓰기로 표시됩니다.

오프라인에서 파일 체크 인

오프라인에서는 네트워크에 연결되어 있지 않기 때문에 체크 인 명령을 사용할 수 없으며, 따라서 파일을 체크 인할 수 없습니다. 프로젝트를 다시 온라인으로 이동할 때 오프라인에서 체크 아웃했던 파일을 알기 쉽게 주의해야 합니다.

온라인으로 이동

기본적으로 오프라인으로 이동할 때와 동일합니다. 솔루션과 프로젝트를 온라인으로 이동하려면 File 메뉴에서 Source Control을 클릭한 다음 Change Source Control을 클릭합니다. 오프라인으로 이동할 때와 동일한 대화 상자가 표시됩니다. Connected를 선택하여 솔루션과 프로젝트를 온라인으로 이동합니다.

변경 내용 동기화

오프라인에서 변경한 내용을 Visual SourceSafe 데이터베이스에 포함된 솔루션 및 프로젝트 파일과 동기화하려면 오프라인에서 체크 아웃한 각 파일을 Visual SourceSafe에서 체크 아웃하고 해당 파일의 복사본을 Visual SourceSafe로 체크 인해야 합니다.

오프라인으로 이동한 후 각 파일을 오프라인에서 체크 아웃하면 다음과 같은 두 대화 상자가 표시됩니다.

teamworvs10.gif

그림 10. 연결이 끊어진 상태로 체크 아웃한 파일 조정 

우선 Check out(그림 10)을 클릭합니다.

teamworvs11.gif

그림 11. Visual SourceSafe에서 파일 체크 아웃 

Leave this file을 선택하여 수정한 내용을 Visual SourceSafe에 포함된 버전으로 덮어쓰지 않게 합니다. 그런 다음 수정한 파일을 체크 인해야 합니다.

경고   다른 사용자가 파일을 이미 체크 인한 상태에서 사용자가 같은 파일을 체크 인하는 경우에는 다른 사용자의 변경 사항을 덮어쓰게 됩니다.
참고   이러한 대화 상자는 오프라인에서 체크 아웃한 파일에 대해서만 표시되며, 오프라인으로 이동하기 전에 이미 체크 아웃한 파일에 대해서는 표시되지 않습니다. 첫째 대화 상자에 표시된 것처럼 데이터가 손실될 수 있으므로 주의하시기 바랍니다.

오프라인에서 작업하는 동안 파일 하나를 체크 아웃하고 다른 팀 구성원이 같은 파일을 체크 아웃하여 수정한 다음 체크 인한 경우 주의하지 않고 해당 파일을 체크 인하면 다른 팀 구성원이 수정한 내용을 덮어쓰게 됩니다. 덮어쓰는 일이 없도록 하려면 오프라인 상태에서 파일 체크 아웃을 하지 않습니다. 오프라인으로 이동하기 전에 항상 작업할 파일을 체크 아웃하십시오. 오프라인으로 이동하기 전에 작업할 파일을 체크 아웃하는 것이 불가능하거나 잊고 못한 경우에는 변경 사항을 동기화할 때 파일을 수동으로 병합하시기 바랍니다.

오프라인에서 작업하는 동안 파일을 체크 아웃한 경우 다른 사용자가 같은 파일을 체크 아웃하면 솔루션과 프로젝트를 온라인으로 이동할 때 다음과 같은 대화 상자가 표시됩니다.

teamworvs12.gif

그림 12. 이미 체크 아웃된 파일을 다시 체크 아웃하려고   표시되는 경우 

OK를 클릭합니다. Solution Explorer 내의 관련 파일 옆에 작은 경고 기호가 표시되어 해당 파일에 여전히 주의가 필요함을 나타냅니다.

마지막으로 오프라인에서 프로젝트에 파일을 추가한 경우 해당 프로젝트를 온라인으로 이동할 때 새 파일을 Visual SourceSafe에 체크 인하기만 하면 됩니다.

팁과 트릭

일관성 있는 URL

모든 개발자가 가상 루트에 대해 일관적인 위치(예: http://localhost/projectName)를 사용하는 것이 좋습니다. 특정 서버 이름을 사용하면 사용자들 간에 프로젝트 파일을 공유하기가 어려워질 수 있기 때문에 사용하지 않는 것이 좋습니다. 특정 서버 이름을 사용해야 하는 경우 web.config 파일에서 새 <configSections>를 정의하고 해당 를 사용하여 응용 프로그램에 대한 사용자 지정 설정을 정의합니다. 웹 참조를 사용하는 경우에는 웹 서비스를 로컬에 호스트하고 웹 참조로 http://localhost/webServiceName을 사용하거나, 웹 참조 URL 동작을 동적(Dynamic)으로 설정합니다. 동적 URL 동작은 나중에 설명하겠습니다.

일관성 있는 참조 경로

비시스템 어셈블리에 참조를 추가할 때 IDE는 어셈블리를 프로젝트에 로컬로 복사합니다. 웹 응용 프로그램에서는 어셈블리가 bin 디렉터리에 복사됩니다. 어셈블리를 로컬로 복사할지 여부를 제어하려면 해당 어셈블리를 마우스 오른쪽 단추로 클릭한 다음 Properties를 클릭합니다. 비시스템 어셈블리에서는 Copy LocalTrue로 설정해야 합니다. 이것은 기본값이며 대부분의 경우에 권장됩니다.

참조를 추가하면 IDE는 사용자 프로젝트 파일에서 참조 경로를 업데이트하여 어셈블리가 생성된 실제 위치를 나타냅니다. 프로젝트를 마우스 오른쪽 단추로 클릭하고 Properties를 클릭합니다. Common Properties를 클릭한 다음 References Paths를 클릭합니다. 대화 상자(그림 13)에서 Cancel을 클릭합니다.

teamworvs13.gif

그림 13. 참조 경로 표시 

참조 경로는 프로젝트 속성으로 표시되지만 실제로는 설정된 프로젝트, 컴퓨터 및 사용자와 관련이 있습니다. 이것은 개발자 1이 어셈블리에 참조를 추가하고 프로젝트 파일을 체크 인할 경우 개발자 2가 해당 프로젝트 파일의 최신 버전을 가져오면 어셈블리는 Solution Explorer에 표시되지만, 개발자 2는 같은 참조 경로를 가질 수 없기 때문에 빌드가 실패하게 됨을 의미합니다.

이 문제를 해결하려면 팀 내의 모든 개발자가 팀 전체에 일관성 있는 참조 경로에 동의해야 합니다. 이 방법을 수행하면 개발자는 다른 개발자가 참조를 추가한 후 솔루션이나 프로젝트 파일에 아무것도 수행할 필요가 없습니다. 이 경우 다음을 가정합니다.

  • 참조 경로가 이미 설정되어 있고 각 프로젝트 작업에 대해 한 번만 수행해야 합니다.

  • 올바른 위치의 로컬 디스크에 참조 어셈블리가 이미 있습니다.

이 방법에서는 표준 빌드-출력 위치를 정의해야 하며 모든 참조가 해당 위치에 있는 어셈블리를 참조해야 합니다. 이것이 너무 제한적이면 참조 경로에서 여러 경로를 쉼표로 분리할 수 있습니다.

웹 참조 추가

이것은 Visual Studio .NET 베타 1과 비교하여 Visual Studio .NET 베타 2에서 향상된 다른 영역입니다.

프로젝트가 포함된 폴더에 Web References 폴더가 표시됩니다. 웹 참조를 추가하면 Web References 폴더 아래에 새 폴더가 만들어집니다. 새 폴더에는 웹 서비스를 호스트하는 서버에 따라 이름이 지정되고 WSDL, DISCO 및 생성된 웹 서비스 클라이언트 프록시가 포함됩니다. 폴더 이름은 웹 서비스 클라이언트 프록시에 대한 이름 공간으로도 사용됩니다.

이 폴더와 파일들은 웹 참조를 추가할 때 Visual SourceSafe 프로젝트에 추가됩니다. 웹 참조를 업데이트하면 이 파일들도 체크 아웃되고 업데이트된 다음 다시 체크 인됩니다. 웹 참조를 마우스 오른쪽 단추로 클릭한 다음 Update Web Reference를 클릭합니다.

웹 참조를 추가하면 웹 서비스 URL이 웹 서비스 클라이언트 프록시 내에 하드코드됩니다. 그러나 .config 파일에서 웹 서비스 URL을 읽을 수 있도록 웹 서비스 클라이언트 프록시의 동작을 변경할 수 있습니다. 웹 참조를 마우스 오른쪽 단추로 클릭하고 Properties를 클릭한 다음 URL 동작을 Static에서 Dynamic으로 변경합니다.

teamworvs14.gif

그림 14.  참조 속성 

.config 파일에 추가되는 항목은 다음과 같습니다.

<configuration>
    <appSettings>
        <add key="WinApp1.localhost.Service1" value="http://localhost/WebServiceTest/Service1.asmx" />
    </appSettings>
</configuration>
.config 파일에서 웹 서비스 URL을 읽을 수 있도록 웹 서비스 클라이언트 프록시의 생성자도 수정했습니다. 

같은 서버에 있지만 서로 다른 웹 서비스를 가리키는 두 웹 참조를 추가할 수 없음을 잘 알고 있어야 합니다. 이것은 IDE가 이미 있는 폴더 이름을 사용하여 두 번째 웹 참조를 만들려고 시도하기 때문입니다. 웹 참조가 파일 시스템에 표시되는 방법은 위의 설명을 참조하십시오.

이 문제는 사소한 문제입니다. 폴더 이름과 이름 공간 이름을 웹 서비스를 호스트하는 서버의 이름으로 남겨두지 않고 실제 서비스의 이름으로 변경합니다. 웹 참조를 마우스 오른쪽 단추로 클릭하고 Properties를 클릭한 다음 폴더 이름을 변경합니다.

Visual Studio .NET 베타 2 문제

프로젝트 파일 체크 아웃

프로젝트 파일은 변경해야 할 때마다 자동으로 체크 아웃됩니다. 이것은 프로젝트에 파일을 추가하거나 프로젝트 설정을 변경할 때 일반적으로 발생합니다. 그러나 수정한 후에는 프로젝트 파일이 체크 아웃되지 않는 경우도 있습니다. 일부 환경에서는 폼을 작성하고 편집하는 동안 프로젝트 파일을 체크 아웃하지 않아도 됩니다. 이것은 RTM에서 해결해야 할 알려진 버그입니다.

결국 팀 내의 개발자들 간에 프로젝트 파일에 대한 경합을 일으킬 수 있습니다. 팀 구성원들 간에 프로젝트 파일 체크 아웃 충돌 문제가 있으면 공유 체크 아웃으로 전환을 고려할 수 있습니다.

Solution Explorer에서 특수 문자 !는 해당 프로젝트 파일이 단독으로 체크 아웃되었음을 나타냅니다.

여러 솔루션에 있는 프로젝트

Visual SourceSafe 통합은 여러 솔루션의 일부인 프로젝트를 지원하지만 이 영역에는 버그가 하나 있습니다. Visual Studio .NET 베타 2를 사용할 때에는 지나칠 정도로 주의하여 각 프로젝트가 하나의 솔루션에만 속함을 확인하는 것이 좋습니다.

오프라인 작업

오프라인에서 작업할 때 잘 알고 있어야 할 많은 문제들이 있습니다. 주요 문제는 오프라인에서 작업하는 동안 파일을 성공적으로 체크 아웃하려면 경고 대화 상자가 표시되지 않게 해야 한다는 점입니다. 이 문제와 기타 문제들에 대해서는 위에서 이미 설명했습니다.

Visual SourceSafe에 없는 프로젝트

사소하게 느껴질 수 있지만 Visual SourceSafe에 없는 프로젝트가 있고 솔루션이 Visual SourceSafe에 있으면 해당 프로젝트와 파일들이 Visual SourceSafe에 없더라도 Solution Explorer에 체크 아웃된 것으로 표시됩니다. 체크 아웃된 특수 문자는 '로컬로 변경된' 항목 또는 Visual SourceSafe의 일시 보류된 추가 항목을 가리키는 것으로 이해할 수 있습니다. 체크 인 명령은 프로젝트 파일을 Visual SourceSafe에 추가합니다.

참조 제거

마찬가지로 큰 이슈는 아닙니다만, 비시스템 어셈블리에서 참조를 제거하면 IDE는 사용자 프로젝트 파일에 있는 참조 경로를 업데이트하지 않습니다. 어셈블리가 생성되는 실제 위치는 어셈블리가 더 이상 참조되지 않더라도 참조 경로에 남아 있습니다.

다중 프로젝트 솔루션 작성

각 프로젝트는 기본값인 자체 출력 디렉터리에 작성되어야 합니다. 일반적으로 프로젝트는 bin\debug 또는 bin\release 하위 디렉터리에 작성됩니다. 솔루션 내의 여러 프로젝트를 같은 디렉터리에 작성할 수는 없습니다.

또한 "Copy Local"은 같은 솔루션에서 생성 중인 모든 참조(같은 솔루션 내의 다른 프로젝트에서 참조하는 프로젝트 빌드 출력)에 대해 기본 값인 TRUE로 남아 있어야 합니다. 이것은 어셈블리 참조와 프로젝트 간 참조 모두에 적용됩니다.

요약

Visual Studio .NET 베타 2에서의 팀 작업은 Visual Studio .NET 베타 1에서보다 많이 향상되었습니다. 이제 모든 핵심 시나리오가 작동하고 대부분 매우 잘 작동합니다. 아직 릴리스 이전에 해결해야 할 일부 사소한 버그들이 남아 있긴 하지만 Visual SourceSafe 통합과 IDE의 변경 사항은 모두 개선된 팀 개발 환경을 참조합니다. 이제 개발자들 간에 프로젝트 파일과 소스 파일을 공유하기가 더 쉬워졌으며 응용 프로그램을 개발 환경에서 테스트 및 생산 환경으로 이동하기가 더 쉽습니다.

최종 수정일: 2001년 11월 6일

<원본: http://msdn.microsoft.com/library/Cc671602>

반응형

Visual Studio 개발자가 가져야할 10가지 도구와 10가지 Add-Ins [펌][2007/08/08]

Posted on 2010. 3. 12. 10:15
Filed Under Visual C++

<출처: http://naggingmachine.tistory.com/177>
Visual Studio 개발자가 가져야할 10가지 도구는 이미 ".NET Tools: Ten Must-Have Tools Every Developer Should Download Now" 라는 기사로 비교적 널리 알려져 있는데, 이번에 필요한 도구가 있어서 찾다보니 이 저자가 10가지 Add-Ins을 새로 업데이트 했더군요.  "Visual Studio Add-Ins Every Developer Should Download Now" Visual Studio 개발자라면 한번쯤 '이런 도구 있었으면 좋겠는데...'라고 생각한 도구들이 목록에 있습니다. 아마 설치해서 사용하면 많은 도움을 얻을 수 있으리라고 생각합니다.

그나저나 4년전 쯤, MSDN에 기사올릴려고 그렇게 애를 썼었는데 어떤 이유에 의해서 올리지도 못했건만, 이 저자는 저런 식의 도구 소개로 벌써 글을 두개나 올렸군요. :-) 저도 다시 한번 해볼랍니다..

Tools
Snippet Compiler
Regulator
CodeSmith
Building a Custom Template
NUnit
Writing an NUnit Test
FxCop
Lutz Roeder's .NET Reflector
NDoc
NAnt
NAnt in Action
Switch Tools

Add-Ins
TestDriven.NET
GhostDoc
Smart Paster
CodeKeep
PInvoke.NET
VSWindowManager PowerToy
WSContractFirst
VSMouseBindings
CopySourceAsHTML
Cache Visualizer
반응형

[MFC] Dialog 클래스명 바꾸기(rc편집)

Posted on 2010. 2. 25. 12:52
Filed Under Visual C++

<출처: http://blog.naver.com/amoros21/140024540662 2006/05/23>

다이얼로그도
윈도 클래스명 바꾸기(32770_바꾸기)

가끔은 클래스명으로 FindWindow를 할수도 있고  SendMessage, PostMessage를 보낼때가 있는데
대부분 다이얼로그는 클래스 명이 #32770으로(Spy++) 되어 있다.

1. 리소스파일(rc파일)을 메모장으로 열고..
IDD_MAINTAB_DIALOG DIALOGEX 0, 0, 195, 44
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "TestSeed"
CLASS "Seed Control"      // CLASS는 그냥 해주시고. 클래스 이름을 입력
FONT 9, "굴림"


2. APP의 InitInstance()에 추가사항
WNDCLASS wClass; 

 // 기존 윈도우 클래스 정보를 얻음.
::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wClass);

// 기존 윈도우 클래스 정보에서 클래스이름만을 변경.
wClass.lpszClassName = _T("Seed Control");
//변경된 클래스정보를 등록.
BOOL bOk;
bOk = AfxRegisterClass(&wClass);

Spy 로 찍어보면 클래스 명이 #32770이 아니라 Seed Control로 변경 되었음을 확인하면,

참고
wClass.style = CS_HREDRAW | CS_VREDRAW; //클래스 스타일
wClass.lpfnWndProc = WndProc; //윈도우 프로시져
wClass.cbClsExtra = 0; //윈도우 클래스 데이터 영역
wClass.cbWndExtra = 0; //윈도우의 데이터 영역
wClass.hInstance = hInstance; //인스턴스 핸들
wClass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //아이콘 핸들
wClass.hCursor = LoadCursor (NULL, IDC_ARROW); //커서 핸들
wClass.hbrBackground = GetStockObject(WHITE_BRUSH); //배경브러쉬 핸들
wClass.lpszMenuName = NULL; //메뉴이름
wClass.lpszClassName = szAppName; //윈도우 클래스 이름

반응형

caption 없는 윈도우 이동하기 [OnLButtonDown]

Posted on 2010. 2. 24. 21:26
Filed Under Visual C++

caption 없는 윈도우 이동하기

void CAPLiveInstallerDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
    CDialog::OnLButtonDown(nFlags, point);

    DefWindowProc(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
}


==>윈도우영역 마우스 L버튼 다운일시, CATION바를 클릭한것처럼 메시지를 보내어, 윈도우 이동가능하게함
<출처: http://psmon.x-y.net/maniwiki/doku.php?do=export_xhtml&id=mfc%3Aprg_mfc>

반응형

[MFCTips] 메인 메뉴 바꾸기 & Tip링크 ★

Posted on 2010. 2. 23. 11:28
Filed Under Visual C++

http://psmon.x-y.net/maniwiki/doku.php?do=export_xhtml&id=mfc%3Aprg_mfc



http://kovi.cafe24.com/MFCTips.html



<출처: http://myhome.hanafos.com/~kukdas/doc/mfc/mainmenu.html>
MFC가 기본적으로 제공하는 IDR_MAINFRAME 라는 메뉴 대신 다른 메뉴를 로딩하도록 고쳐보기로 하겠다.

1) 리소스에 새 메뉴를 추가한다. 메뉴의 id는 IDR_MENU_NEW 로 한다.

2) MainFrm.cpp 의 PreCreateWindow() 함수에서 다음과 같이 추가한다.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
        if( !CFrameWnd::PreCreateWindow(cs) )
                return FALSE;
        // TODO: Modify the Window class or styles here by modifying
        //  the CREATESTRUCT cs
        cs.hMenu = ::LoadMenu(AfxGetInstanceHandle(),
                MAKEINTRESOURCE(IDR_MENU_NEW));         // 추가

        return TRUE;
}

 

(설명)

 MFC가 작성해준 코드에는 항상 IDR_MAINFRAME 가 기본메뉴가 되어 있다. 따라서 이것을 다른 메뉴로 바꿔치기하려면 기본메뉴가 시스템에 "등록" 되는 시점을 알아내어 등록되기 전에 바꿔치기 하면 되는 것이다.

 여기서 PreCreateWindow() 함수는 윈도우가 생성되기 전에 불려지는 함수이다. 만약 윈도우에 무슨 조작을 가하고 싶다면 여기서 인자들을 변경해 주면 그 인자들이 윈도우에 적용되어 윈도우에 자기가 원한 조작이 되는 것이다.

PreCreateWindow의 인자인 CREATESTRUCT는 다음과 같이 정의된 구조체이다.

 

typedef struct tagCREATESTRUCT {

     LPVOID     lpCreateParams;
     HANDLE    hInstance;
     HMENU     hMenu;                 // 이 부분 주목
     HWND       hwndParent;
     int             cy;
     int             cx;
     int             y; 
     int             x;
     LONG        style;
     LPCSTR     lpszName;
     LPCSTR     lpszClass;
     DWORD      dwExStyle;

} CREATESTRUCT;

 

앞의 구조체에서 HMENU hMenu; 라는 부분에서 메인 메뉴에 대한 등록이 이루어진다. 따라서 이 값을 원하는 hMenu 값으로 바꾸면 될 것이다.

반응형

[MFC] MDI 구조 -- link

Posted on 2010. 2. 22. 16:03
Filed Under Visual C++

반응형

[VC6] 컴파일러 옵션 [펌]

Posted on 2010. 1. 29. 15:35
Filed Under Visual C++

<출처: http://tong.nate.com/tigglet/42353507>

 

Compiler options for finding Bugs #1

Compiler Options

의미

/W4

 Warning Level을 최대로 하여 컴파일

 ( 모든 빌드 타입에 가능 )

/D "_DEBUG"

 Assetion, Trace 같은 디버깅용 코드가 컴파일시 포함되록 만든다.

 ( 디버그 빌드에서만 )

/GZ

 생성시에 초기화 되지 않는 변수를 특정 값으로 채워 흔히 디버그에서는 나타나지 않고 릴리즈 빌드에서 나타나는 에러를 사전에 검사할 수 있게 하여 디버그에 도움이 되게 함. ( 디버그 빌드에서만 )

/Od

 최적화하지 않는다. 코드를 디버그에 적합하게 만든다.

 ( 디버그 빌드에서만 )

/GF

 실행 파일에 들어갈 스트링이 중복될 경우 이를 제거, 공동으로 사용되는 이 스트링이 할당된 메모리를 읽기 전용으로 설정하여 우발적인 메모리 쓰임으로 부터 보호함. ( 정적 문자열.. )

 

 char *s = "This is a character buffer";

 char *t = "This is a character buffer";

 

위와 같은 경우 같은 스트링이므로 스트링을 서로 공유 함.

( 릴리즈 모드에서 명시적으로 사용시 )

/Gf

 실행파일에 들어갈 스트링을 공유하는 것은 위와 같으나 우발적인 메모리 쓰임으로 부터 보호 하지 않음.

/ZI

 디버깅 심벌용 프로그램 데이터베이스를 만듬.

 디버그로 실행시에 코드를 편집후 연속해서 디버깅이 가능하게 정보를 관리.

 ( 디버그 빌드에서만 )

/Zi

 디버깅 심벌용 프로그램 데이터베이스를 만듬.

 ( 릴리즈 빌드에서만 )

 

 

 

Compiler options for a debug build #1

Linker Options

의미

/MDd, /MLd, /MTd

 디버그 런타임 라이브러리 사용.

/Od

 최적화하지 않는다.

/D "_DEBUG"

 디버그용 코드가 컴파일 되게 한다.

/ZI

 편집, 연속 디버깅이 가능하게 디버그용 데이터배이스를 만듬.

/GZ

 디버그 빌드에서의 흔한 실수로 릴리즈에서 나타나는 에러를 디버그모드에서 검출.

/Gm

 빌드 시간을 재빌드시에 감축시키기.

 

 

 Compiler options for a release build #1

Linker Options

의미

/MD, /ML, /MT

 릴리즈 런타임 라이브러리 사용.

/O1 or /O2

 속도 최적화나 사이즈 작게 최적화 같은 것을 가능하게.

/D "NDEBUG"

 디버그용 코드가 컴파일되지 않게 함.

/GF

 중복된 문자열을 방지, 읽기 전용으로 데이터를 보호함.

 

디버그 런타임 라이브러리 사용시 특징 #1

  • 디버그 런타임 라이브러리는 메모리 할당을 추적하고 메모리 누수를 점검한다.
  • 힙에서 새로이 메모리 할당되어 초기화 되지 않은 데이터에 "0XCD"의 바이트 패턴으로 써놓는다. ( ex : 0xCDCDCDCD )
    지역 변수인 경우,  초기화 되지 않은 데이터에 "0XCC“의 바이트 패턴으로 써놓는다. ( ex : 0xCCCCCCCC, /GZ" 컴파일러 옵션 사용시, 미사용시에는 디버그 모드에서 0 로 초기화 함 - 이것은 잠제적인 버그 유발 가능성이 많다. )
  • 힙에서 메모리 할당이 해제될 경우에 “0XDD"의 바이트 패턴으로 표시를 하여 해제된 메모리라고 알 수 있도록 표시한다. ( 0xDDDDDDDD 혹은 0xFEEEFEEE )
  • 할당된 메모리 버퍼의 양쪽 끝 부분에 4byte 로 “0XFD"의 바이트 패턴으로 표시를 해둬서 memory overwritememory underwrite를 체크할 수 있게 한다. ( "0xFDFDFDFD" 즉 디버그 모드에서는 메모리 할당시에 양쪽에 각각 4 byte 의 공간이 마킹하기 위해서 추가적으로 할당이 된다. )
  • 메모리 할당시 소스코드 상에서의 위치를 알아 내는데 도움이 되도록 소스코드의 파일 이름과 해당줄을 추적을 위해서 넣어 놓는다.

 

 

릴리즈 모드에서 디버깅 하기 #1'

 

 설정을 변경하면 디버깅은 잘되나 배포판을 만들 경우에는 변경된 옵션을 환원하고 빌드하자.

자주 써야 할 경우 빌드 타입을 하나 더 만들어서 사용하는 것도 한가지 방법이다.

 

 

vs 6.0 기준

  1. Project/Settings/Project Setting"을 선택.
  2. C/C++“ 탭에서 ”General" 카테고리를 선택해서 "Optimizations"을 “Disable(Debug)"로 선택하고 “Debug info" 항목을 ”Program Database“로 수정.
  3. "Link" 탭에서 “Debug" 카테고리를 선택하면 ”Debug info" 항목이 있는데 여기서 "Microsoft format"을 선택.
  4. Link" 탭에있는 ”Project Options" 박스에 들어 있는 내용의 맨 끝에 "/OPT:REF"를 추가 한다.
  5. 반드시 “Rebuild All"로 제 컴파일을 한다.

 

vs .net 기준

  1. 솔루션 탐색기에서 프로젝트를 선택한 다음 메뉴의 “프로젝트/ XXX 속성"을 선택.
  2. C/C++의 일반 항목중에서, 디버깅 정보 형식을 “사용안함"에서 “편집하며 계속하기를 위한 프로그램 데이터베이스(/ZI)"로 변경.
  3. C/C++의 최적화 항목중에서, 최적화를 “속도 최대화(/O2)" 혹은 "크기 최소화(/O1)”등에서 “사용안함(/Od)"로 변경.
  4. C/C++의 최적화 항목중에서, 인라인 함수 확장을 “__inline만 확장(/Ob1)"  혹은 "적합한것 모두(/Ob2)"등에서 "기본값"으로 변경.링링커의 디버그 항목중에서, 디버그 정보 생성을 “아니요”에서 “예(/DEBUG)"로 변경
  5.  

 

Registers And Pseudo-registers #1

 Register값은 “Registers" 윈도우에서 확인이 가능하지만 단순하고 값만을 알수 있다. 이 값들을 ”Address(Watch)" 박스에서도 확인이 가능하며 여러 부가 기능과 같이 쓸수 있다.

 예를 들어 EAX의 값을 확인 해볼려고 하면 Watch 항목에 “@EAX"혹은 ”@eax"와 같이 대소문자를 구분하지 않고 넣으면 이 래지스터의 값을 확인 할 수 있다.

 또한 Pseudo-register"의 값또한 확인 할수 있는데. "@ERR"Pseudo-register 값은 매우 유용하게 사용할 수 있는데 이 값이 GetLastError의 값을 나타내기 때문이다. 만약 “@ERR,hr"이라고 입력한다면 Win32의 에러코드에 해당하는 택스트를 보여 줄것이다.

 

 

 Pseudo-register

의미

@ERR

GetLastError API로 알 수 있는 가장 최근에 반환된 에러 코드를 보여줌

@CLK

누적시간(MicroSecond)을 보여줌.

@TIB

TIB의 주소를 보여줌.

 

 

 

Pseudo-registers that the Watch window supports #1

 

Register

사용(용도)

@EAX

일반 용도, 함수의 return 값으로 사용

@EBX

일반 용도

@ECX

일반 용도, 오브젝트의 this 포인터로 사용.

@EDX

일반 용도, 64비트의 return값의 경우 상위 값의 반환에 사용.

@ESI

메모리 이동과 비교 연산시의 원본 메모리

@EDI

메모리 이동과 비교 연산시에 대상 메모리

@EIP

명령 포인터 ( 코드의 현제 위치 )

@ESP

스텍 포인터 ( 스텍의 현제 위치 )

@EBP

스텍 배이스 포인터 ( 현제 스텍 프레임의 바닥 )

@EFL

비교나 수학 연산을 위한 플래그 비트

@CS

Code segment

@SS

Stack segment

@DS

Data segment

@ES

Extra segment

@FS

Another extra segment, used to point to the TIB

@GS

Yet another extra segment

 

Watch Window Formatting Symbols #1

 Watch 윈도우는 변수의 값을 볼수 있게 해주는데, 값을 십진수나 16진수로서 확인할 수 있다. 16진수는 팝업 메뉴에서 “Hexadecimal Display"를 선택하면 볼수 있다. 이 이외에도 여러 가지 옵션을 주어서 사용할 수 있는데 이들은 Watch Window에 등록되는 변수명 뒤에 ","를 삽입하고 그뒤에 옵션을 주어 사용할 수 있다.

 

Symbol

Format

Example

Output

d, i

부호있는 10진 정수

-42,d

-42

u

부호없는 10진 정수

42,u

42

o

부호없는 8진 정수

42,o

052

x

16진 정수

42,x

0x0000002a

X

16진 정수

42,X

0x0000002A

h

Short prefix for d,i,u,o,x

42,hx

0x002a

f

실수

1.5,f

1.500000

e

부호 있는 과학용 표기

1.5,e

1.500000e+000

g

Compact float

1.5,g

1.5

c

문자

42,c

'*'

s

ANSI 문자열

"bugs",s

"bugs"

su

UNICODE 문자열

"bugs",su

L"bugs"

st

기본 문자열형 ( s, su중에서 )

"bugs",st

"bugs"

hr

HRESULT, Win32 error code

0x06,hr

The handle is invaid

wm

Wndows message number

0x01,wm

WM_CREATE

[digits]

배열

s,5

배열 5개의 항목 표시

 

 

 

 

디버깅에 도움이 되는 메모리 마킹 패턴 #1'

 

 

Byte Pattern

의미

0xCCCCCCCC

초기화 되지 않은 stack 메모리

0xCDCDCDCD

초기화 되지 않은 heap 메모리

0xDDDDDDDD

힙에서 해지된 메모리 영역

0xFDFDFDFD

힙에 할당된 메모리 블록 양쪽 4byte의 공간 마킹

0xABABABAB

LocalAlloc()로 할당된 메모리

0xBAADF00D

LocalAlloc(LMEM_FIXED, )로 할당된 메모리

0xFEEEFEEE

HeapFree()로 해지된 상태

 

가끔 오류가 발생했을 경우에  만날수 있는 magic number. ( 디버깅 모드에서만 byte pattern 으로 마킹됨. )

 

non-MFC 프로젝트에서 메모리 릭(Memory Leck) 검출

 mfc 프로젝트에서는 DEBUG_NEW 가 기본적으로 제공되므로 메모리 릭을 검출하기가 용의하다. 하지만 일반 프로젝트에서는 추가적인 설정이 필요하다.

// CRT's memory leak detection
#if !defined(_AFXDLL)
   #include <windows.h>
   #include <crtdbg.h>
   #if defined(DEBUG) | defined(_DEBUG)
      #if !defined(DEBUG_NEW)
         #define DEBUG_NEW new(_CLIENT_BLOCK, __FILE__, __LINE__)
      #endif
   #endif
#endif

 위와 같은 코드를 기초 인클루드 파일에 추가하면 된다. ( 예를 들어 StdAfx.h 와 같은 곳에.. )

그리고 아랫 내용을 cpp 파일의 상단(인클루드 아랫 부분)에 추가하면 된다.

 #ifdef _DEBUG
#define new DEBUG_NEW
#endif

그리고

  1. WinMain( ... )
  2. {

    1. _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    2. .
    3. .
    4. .
  3. };

위와 같이 App 최초 구동시 메모리 릭 검출 디버깅 옵션을 켜준다.

 

그러면 디버그 모드로 실행 했을 경우 App 종료시 output 창에 메모리 릭 발생시 메모리 릭 정보가  해당 소스 파일과 라인등 정보와 함께 출력되는 것을 볼수 있을 것이다.

 

실수 연산 오류 발생시 Exception 발생 시키기 #2

    int stat = _controlfp(0, 0);
   stat &= ~(EM_ZERODIVIDE);
   _controlfp(stat, MCW_EM);

와 같이  EM_ZERODIVIDE 옵션을 추가하였다면 0으로 나눌 경우 해당 코드 부분에서 exception이 발생하므로 발생 부분을 즉시 확인할 수 있는 효과가 있다. 기타 다른 옵션은 MSDN 에서 _controlfp를 찾아서 확인하자.

 

Special Floating-Point Values and Their Representations #3

Value

Hex

Signed 32-Bit Int

Name

-1.#QNAN

FFFFFFFF

~

FF800001

-1

~

-8388607

Negative NaNs

-1.#INF

FF800000

-8388608

-∞

0

 

 

 

0

 

 

 

 

 

 

+∞

+1.#QNAN

7F800001

~

7FFFFFFF

2139095041

~

2147483647

Positive NaNs

 

*, 1.#QNAN 의 경우 1.#INF ( 무한대의 값 ) 으로 연산시에 발생함.

 

 Pure virtual Function Call #4

순수 가상 함수를 파괴자 등에서 호출하여 생기는 오류 검출 방법.

 

  1.  _set_purecall_handler(_purecall_handler function);

 

위의 함수를 사용하여 순수 가상 함수 호출시 임의의 오류 처리 함수를 호출하도록 하여 해당 부분을 검출해낼수 있다.

아래와 같이 설정하였다면 순수 가상 함수가 호출되는 순간 assert 가 호출되므로 해당 부분의 call-stack 을 확인해보자.

 

  1. void my_purecall_handler(void)
  2. {

    1. assert(0 && "pure virtual function call !!!");
    2. printf("pure virtual function call !!!");
  3. }
  4.  
  5. void main(int argc, char* argv[])
  6. {

    1. _set_purecall_handler(my_purecall_handler);
    2.  
  7. }

 

 References
  • #1 : Debugging Windows Programs: Strategies, Tools, and Techniques for Visual C++ Programmers / Everett N. McKay, Mike Woodring / Addison-Wesley / 2000
  • #2 : Game Programming Gems ?
  • #3 : Game Programming Gems 6
  • #4 msdn "Run-Time Library Reference : Error-Handling Routines"
반응형

Oracle 개발환경 설정 및 배포 [링크]

Posted on 2010. 1. 7. 14:22
Filed Under Visual C++

반응형

About

by 쑤기c

반응형