320x100

[에러] OBJCORE.CPP(29) : warning C4273

Posted on 2009. 6. 19. 10:13
Filed Under Visual C++


어느순간부터 아래같은 에러가 떨어졌다.
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\OBJCORE.CPP(29) : warning C4273: 'public: static struct CRuntimeClass const CObject::classCObject' : inconsistent dll linkage.  dllexport assumed.
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\OBJCORE.CPP(29) : error C2491: 'CObject::classCObject' : definition of dllimport static data member not allowed
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\OBJCORE.CPP(158) : error C2065: 'AfxLockGlobals' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\OBJCORE.CPP(158) : error C2065: 'CRIT_RUNTIMECLASSLIST' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\OBJCORE.CPP(160) : error C2065: 'AfxUnlockGlobals' : undeclared identifier
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\OBJCORE.CPP(211) : error C2065: 'CRIT_DYNLINKLIST' : undeclared identifier

OBJCORE.CPP는 MFC소스자나..? 얘가 어쨌다는겨; -_-+
다른 프로젝트 로딩해서 컴파일했는데 잘 된다.
삽질하다 데브피아 Visual C++마을가서 Q&A 검색[키워드:objcore.cpp] 하니
운좋게도 똑같은 문제의 질문이 보였다. '앗! 럭키~!'

[질문] VC++ 일반 2002-03-15 오후 3:21:00   백성우  번호: 183680
에러좀 잡아주세요
 
[답변] 글번호: 183683   2002-03-15 오후 3:29:00   장인우
소스를 본건 아니구요... 그냥... 컴파일 했더니 Objcore.cpp가 Workspace view의 File 
View 탭에 들어가 있던데요?
그거 지우면 에러없이 컴파일 됩니다.. ^^;
 
라는..설마설마 했더니 역시다. OBJCORE.CPP지우고 컴파일하니 해결되었다.
아 허망~ T_T
2주일 코딩한거 롤백할뻔했다. 덜덜..
질문해준 성우님두 답변해준 인우님두 싸랑해욧 >_</
반응형

.NET Framework 4.0과 Visual Studio 2010 소개

Posted on 2009. 6. 16. 16:00
Filed Under Visual C++

강연자료
<강연자: http://blog.naver.com/jacking75>

뭔소린지 잘 모르것다 ㅠㅠ
반응형

[VS2008] MS home

Posted on 2009. 6. 15. 11:51
Filed Under Visual C++

반응형

managed code?

Posted on 2009. 6. 15. 10:12
Filed Under Visual C++


1. Managed code 개요

 관리되는 코드(Managed code)는 CPU에서 직접 실행되는 네이티브 코드(Unmanged code)와 달리 가상 머신의 관리 하에서 실행되는 프로그램 코드이다. 관리되는 코드는 프로그래머에게 편리성, 보안성, 안정성을 보장한다. 주로 "관리되는 코드"라는 용어는 보편적으로 Microsoft 진영에서 많이 사용된다. C#, Visual Basci .NET등의 언어를 이용해서 관리되는 코드를 생성한다.

 

2. 닷넷 프레임워크 에서의 Managed code

 닷넷 프레임워크 즉 CLR에서 실행되는 모든 프로그램들은 관리되는 프로그램(Managed program)들이다(Win32 API로 만들어지는 프로그램들을 네이티브 코드 또는 비관리 프로그램이라 한다).

 모든 닷넷 기반 프로그램(관리되는 프로그램)들은 확인 프로세스를 통과해야만 실행 할 수 있다. 예외적으로 관리자가 이 프로세스를 건너 뛸 수 있는 권한을 부여한 경우에는 그냥 실행 될 수 있다. 확인 프로세스는 해당 코드들이 잘못 된 메모리 주소에 엑세스할 가능성이 있는지, 또는 실행 중인 프로세스를 정상 동작을 할 수 없게 하는 다른 작업을 수행하는지 등을 확인한다. 이 때문에 관리되는 코드 또는 프로그램이라고 부른다. 원천적으로 잘못된 메모리 주소에 엑세스하는 경우를 막고있기 때문에 CLR에서 실행되는 관리 코드들은 다른 프로세스가 사용하는 메모리 영역(또는 시스템이 사용하는 메모리 영역)등을 건드려서 시스템 전체가 다운되는 경우가 없다.

<출처: http://ocplay.tistory.com/6>

반응형

C++에서 C# DLL 사용하기/ C++에서 WinForm 사용하기

Posted on 2009. 6. 11. 18:40
Filed Under Visual C++

반응형

GDI+ 관련링크

Posted on 2009. 6. 10. 17:22
Filed Under Visual C++

2007/ 사용하기. FAQ사이트

http://blog.naver.com/konny2020/40008556335

반응형

[VC++관련도구] Parasoft Insure++®

Posted on 2009. 6. 10. 11:53
Filed Under Visual C++


Parasoft Insure++®

http://www.parasoft.com/jsp/templates/ads/google/googleins1.jsp;jsessionid=baa-4mX7_jCpUO?redname=googleins1&referred=searchengine%2Fgoogle%2Finsure

Insure++ is a runtime memory analysis and error detection tool for C and C++ that automatically identifies a variety of difficult-to-track programming and memory-access errors, along with potential defects and inefficiencies in memory usage. Errors such as memory corruption, memory leaks, access outside of array bounds, invalid pointers, and the like often go undetected during normal testing, only to result in application crashes in the field. Insure++ will help you find and eliminate such defects in your applications to ensure the integrity of their memory usage.


Insure++ works as a plug-in for Visual C++
  • Microsoft Visual C++ 6.0
  • Microsoft Visual C++ .NET
  • Microsoft Visual C++ .NET 2003
  • Microsoft Visual C++ 2005
  • Microsoft Visual C++ 2008

  • 런타임 메모리 분석두하구
    메모리 새는것도 찾아주는 툴이란다.
    오호 이런것두 있넹;

    반응형

    레지스트리에서 IEXPLORER.EXE 파일 위치 찾기

    Posted on 2009. 6. 9. 17:48
    Filed Under Visual C++

    코드로 Internet Explorer를 띄우려면 iexplorer.exe 로 실행할 수 있다.

    C:> IEXPLORER.EXE   http://www.yahoo.co.kr

    iexplorer.exe 이 항상 C:에 위치하면 좋겠건만 만약에 다른 드라이브에 설치되어있다면 난감;
    그럼, 파일의 위치는 어떻게 찾느냐?

    아래 레지스트리 위치에서 찾을 수 있단다.

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE]
    @="C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE"
    "Path"="C:\\Program Files\\Internet Explorer;"

    알아두자!

    반응형

    [IE] Internet Explorer Architecture

    Posted on 2009. 5. 12. 12:46
    Filed Under Visual C++

    Internet Explorer Architecture

    Windows Internet Explorer's modular architecture enables developers to reuse some of its components as well as extend and enhance the browser's functionality. Examples of extensions to Internet Explorer include custom shortcut menus, browser toolbars, Microsoft ActiveX controls, active documents, and binary behaviors. This topic provides a high-level overview of Internet Explorer's architecture, information on the reuse of its components, and a summary of some of the powerful methods of extensibility available to developers. It contains the following sections.

    COM-Based Architecture

    To choose the most appropriate reuse or extension mechanism for your needs, it is first important to understand Internet Explorer's architecture. Essential to the browser's architecture is the use of the Component Object Model (COM), which governs the interaction of all of its components and enables component reuse and extensibility. The following diagram illustrates Internet Explorer's major components.

    A description of each of these six components follows:

    • IExplore.exe is at the top level, and is the Internet Explorer executable. It is a small application that relies on the other main components of Internet Explorer to do the work of rendering, navigation, protocol implementation, and so on.
    • Browsui.dll provides the user interface to Internet Explorer. Often referred to as the "chrome," this DLL includes the Internet Explorer address bar, status bar, menus, and so on.
    • Shdocvw.dll provides functionality such as navigation and history, and is commonly referred to as the WebBrowser control. This DLL exposes ActiveX Control interfaces, enabling you to easily host the DLL in a Microsoft Windows application using frameworks such as Microsoft Visual Basic, Microsoft Foundation Classes (MFC), Active Template Library (ATL), or Microsoft .NET�Windows Forms. When your application hosts the WebBrowser control, it obtains all the functionality of Internet Explorer except for the user interface provided by Browseui.dll. This means that you will need to provide your own implementations of toolbars and menus.
    • Mshtml.dll is at the heart of Internet Explorer and takes care of its HTML and Cascading Style Sheets (CSS) parsing and rendering functionality. Mshtml.dll is sometimes referred to by its code name, "Trident". Mshtml.dll exposes interfaces that enable you to host it as an active document. Other applications such as Microsoft Word, Microsoft Excel, Microsoft Visio, and many non-Microsoft applications also expose active document interfaces so they can be hosted by shdocvw.dll. For example, when a user browses from an HTML page to a Word document, mshtml.dll is swapped out for the DLL provided by Word, which then renders that document type. Mshtml.dll may be called upon to host other components depending on the HTML document's content, such as scripting engines (for example, Microsoft JScript or Visual Basic Scripting Edition (VBScript)), ActiveX controls, XML data, and so on.
    • Urlmon.dll offers functionality for MIME handling and code download.
    • WinInet.dll is the Windows Internet Protocol handler. It implements the HTTP and File Transfer Protocol (FTP) protocols along with cache management.

    Extending Internet Explorer

    As Internet Explorer's component architecture is based on COM, there are many different ways to extend its capabilities. These can be broken down into three broad categories of extensions as follows:

    • Browser Extensions. This category of end-user extensions adds additional functionality to Internet Explorer content. It includes features such as shortcut menu extensions, custom toolbars, Explorer Bars, and Browser Helper Objects (BHOs).
    • Content Extensions. These extend the types of content that can be parsed and displayed; their use depends on the content being loaded into the browser. This category includes ActiveX Controls and active documents.
    • Hosting and Reuse. By hosting and reusing the Internet Explorer components as part of your own application, you can build your own browser or add rich rendering and Internet capabilities.

    Browser Extensions

    This class of extensibility adds to the user interface (UI) of the browser and is not directly related to the viewable content of Web pages. It includes add-on functionality that users might install to enhance their browsing experience.

    Content Extensions

    This category of extensions is invoked specifically by Internet Explorer content. It includes ActiveX controls, binary behaviors, and active documents.

    • Active Documents. Active documents are sometimes called Doc Objects. If you plan to replace HTML with your own rendering of specific content, an active document may be appropriate. For example, when a user navigates from an HTML page to a Word document, the mshtml.dll active document is swapped out for Word's active document viewer. Internet Explorer's support for active documents includes the ability to merge menus so that Internet Explorer's menus reflect the functionality available in the new active document. For more information, see Active Documents.
    • ActiveX Controls.�ActiveX controls are a very powerful mechanism for extending the abilities of HTML. For more information, see Introduction to ActiveX Controls.
    • Behaviors. The Behavior technology in Internet Explorer allows even deeper integration with the HTML rendering engine than ActiveX controls. There are two categories of behaviors. First are script-based behaviors using .htc files. While these are useful, they are not true extensions to browser functionality. However, you may want to consider script-based behaviors with .htc files before using a full browser extension as they provide a way to componentize and reuse HTML content.

      Binary behaviors are the second category of behavior extensions. Binary behaviors are similar to ActiveX controls in that they are COM objects, but they are more deeply integrated with the HTML parser and renderer. Examples of binary behaviors include extensions for MathML and Scalable Vector Graphics (SVG), which allow the markup for math or vector graphics to be easily mixed in with HTML. For more information, see Binary Behaviors Overviews and Tutorials.

    • Windows Forms Controls. As managed code and the .NET Framework have been established as the developer framework for the future, they are also available to developers wishing to develop controls for Internet Explorer. For more information, see Windows Form Controls
    • Pluggable Protocols. Pluggable protocols Internet Explorer to support custom communication protocols and are generally specific to the data they support. For more information, see Asynchronous Pluggable Protocols.

    Hosting and Reuse

    Internet Explorer's components can easily be reused thanks to its COM-based architecture. Two commonly used components are shdocvw.dll (the WebBrowser control) and mshtml.dll ("Trident").

    In the majority of situations, it is better to directly host shdocvw.dll than mshtml.dll. This is because shdocvw.dll supports in-place navigation, history, and so on�that is, the full capabilities of the browser. If you host mshtml.dll directly, you gain the use of an HTML and CSS parser and renderer, but you cannot take advantage of the browser's other capabilities.

    An example of a situation in which you might want to host mshtml.dll directly is the scenario of an e-mail application and HTML-based e-mail. In this scenario, the e-mail is displayed within the application, but if a user clicks on a hyperlink within the e-mail, the user would expect a separate browser instance to open rather than the e-mail application navigating in place. This is how applications such as Microsoft Outlook and Outlook Express handle HTML-based e-mail.

    For more information about hosting and reuse, see Hosting and Reuse.

    Summary

    The COM-based architecture of Internet Explorer supports a variety of extension mechanisms. It is important to understand the architecture and the available extension mechanisms to enure you use the one
    most appropriate for your application needs.

    <출처> http://msdn.microsoft.com/en-us/library ··· %29.aspx
    Web Development
    └ Internet Explorer Development
        └ Internet Explorer Architecture
    ===================================================================================================


    <출처> http://cyhome.cyworld.com/?home_id=a188 ··· D2943793
    LINK: http://debugjung.tistory.com

    반응형

    Chapter 1. 시작을 위한 준비 (Win32 API 프로그래밍)

    Posted on 2009. 5. 12. 12:43
    Filed Under Visual C++


    Chapter 1 시작을 위한 준비
    1-1 Win32 API 프로그래밍
    윈도우 응용 프로그램 종류 ┌ Console  어플리케이션
                                         └ GUI 어플리케이션
    CRT main 함수
    컴파일러가 최초로 실행하는 함수는 CRT main 함수이다.
    CRT main 함수에서는 ① 전역 변수 객체의 생성자를 호출
    [증명코드]
    [code]class FirstClass
    {
    public:
        FirstClass() {  printf("FirstClass 생성자\n");   };
    }

    FirstClass fc;

    void main()
    {
        printf("테스트\n");
    }[/code]

    [실행결과]
    FirstClass 생성자
    테스트

    ② C 또는 C++ 언어의 전역 변수(__로 시작)를 초기화
        따라서 main 이후에는 이 변수를 사용 가능하다.
    ③ 힙 메모리 초기화
        - 메모리 할당 malloc 함수 - ANSI 표준 C/C++을 위해 구현된 함수로 - 내부에서는 윈도우즈의 힙 할당 함수인 HeapAlloc 함수를 호출한다. HeapAlloc 을 위해서는 사전에 HeapCreate 함수를 호출해야하는데 이를 CRT main에서 해준다.

    Visual Studio .NET의 컴파일러의 경우, 다음과 같은 이름으로 CRT main 함수가 구현되어있다.

    어플리케이션 종류

    문자 집합

    CRT main

    어플리케이션 시작 함수

    콘솔 ANSI mainCRTStartup main
    UNICODE wmainCRTStartup wmain
    GUI ANSI WinMainCRTStartup WinMain
    UNICODE wWinMainCRTStartup wWinMain
    ※ ANSI 문자열 표현: char*      UNICODE 문자열 표현:
    unsigned short*

    CRT main 함수 지정
    프로젝트 속성 > 링커 > 시스템 > 하위 시스템 을 'Windows' 또는 '콘솔' 로 변경

    문자
    집합 지정
    프로젝트 속성 > 일반 > 문자 집합


    1-2 Win32 GUI 프로그래밍
    WinMain 함수 원형
    int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow);

  • 리턴값은 CRT main 함수에서 WinMain 호출후 호출되는 ExitProcess 함수의 인자로 사용된다.
  • APIENTRY = __stdcall 호출 규약(calling convention) =
  • HINSTANCE hInst  : 메모리 상에 로드된 실행 모듈의 베이스 주소 (모듈 핸들=인스턴스 핸들)
  • HINSTANCE hPrevInst  : Wiin95이후 사용 안함 / 항상 NULL
  • LPSTR lpszCmdLine  : 윈도우즈 쉘에서 어플리케이션에 전달하는 명령행 인자. 토큰 분리 되지 않고 하나의 문자열로 전달된다. 고로 사용하려면 토큰 분리해야한다.
  • int nCmdShow  : 윈도우가 처음 화면에 나타날때의 모양 지정  ex:) SW_SHOW
    인스턴스 핸들과 모듈 핸들
    Win95 이전:  동일 어플리케이션이 두번 실행되면 '실행 코드'(중복)는 한번만 로드하고 전역 변수 메모리 블록은 프로세스 단위로 할당한다.
                      인스턴스 핸들 = 프로세스별 전역 변수 메모리 블록의 주소
                      모듈 핸들 = 실행 코드가 로드된 주소
    Win95 이후: 프로세스(어플리케이션) 실행시마다 실행 코드도 프로세스 단위로 다시 로드
                     인스턴스 핸들 = 모듈 핸들


    WinMain 함수의 기본 골격
    WinMain의 역할은 1) 메인 윈도우 생성 2) 메시지 루프 처리
    윈도우 메시지 발생 → 시스템 메시지 큐(OS가 관리) → 해당 어플리케이션 메시지 큐로 전달 → 어플리케이션에서 처리
    메시지 큐를 통하지 않고 바로 윈도우 프로시저가 호출되는 경우도 있다.
    1) Win32 API 호출에 의해 바로 윈도우 프로시저가 실행
        ex:) CreateWindow 호출시 WM_CREATE 메시지는 메시지 큐에 들어가지 않고 바로 윈도우 프로시저 실행
    2) 운영체제가 일 수행을 위해 바로 윈도우 프로시저로 메시지를 보내는 경우(운영체제가 GetMessage를 호출)
        ex:) 운영체제가 윈도우를 움직여도 되는지 WM_MOVING 메시지를 어플리케이션에 보내는 예

    GUI 기본 코드 [more..]


    1-3 핸들
    핸들이 뭐지?
    : (개념적접근)윈도우가 관리중인 실제 객체의 포인터 테이블의 인덱스값

    User 객체(=Window, Cursor, Caret) 핸들 : 시스템 전역적, 다른 어플리케이션에서 값을 얻어와 사용해도 무방.
    GDI 객체 (=DC, Pen, Brush, Font, Bitmap, Palette, Region)핸들 : 프로세스 지역적
    Kernel 객체 핸들(=Process, Thread, File, Sync)


    1-4 유니코드
    유니코드란?
    그럼 어떻게 유니코드를 사용하지?
    Win32 API의 유니코드 지원
    1-5 함수 호출 규약
    _ _cdecl
    _ _stdcall
    _ _fastcall

  • 반응형

    [BOOK] Windows MFC Programming - 스터디노트

    Posted on 2009. 5. 12. 12:42
    Filed Under Visual C++


    유동근, 원리에서 활용까지 윈도우즈 MFC 프로그래밍, 정보문화사


    Chapter 1 시작을 위한 준비
    1-1 Win32 API 프로그래밍
    윈도우즈 어플리케이션은 어디에서 시작하는가?
    진짜 main과 WinMain이 시작 함수일까?
    CRT main 함수 지정
    1-2 Win32 GUI 프로그래밍
    WinMain 함수 원형
    WinMain 함수의 기본 골격
    윈도우 프로시저
    메시지 루프를 종료하기 위해 WM_DESTROY를 처리해야 한다
    화면에 내용을 출력하기 위해 WM_PAINT를 처리해야 한다
    GetMessage를 다시 한 번
    1-3 핸들
    핸들이 뭐지?
    유저 객체 핸들
    GDI 객체 핸들
    커널 객체 핸들
    1-4 유니코드
    유니코드란?
    그럼 어떻게 유니코드를 사용하지?
    Win32 API의 유니코드 지원
    1-5 함수 호출 규약
    _ _cdecl
    _ _stdcall
    _ _fastcall
    1-6 가상함수
    가상함수
    클래스 단위로 컴파일러가 생성하는 가상함수 테이블

    1-7 #pragma와 #, ##
    #pragma
    #과 ##
    핵심 포인트

    Chapter 2 MFC 어플리케이션의 시작과 끝
    2-1 가장 간단한 MFC 프로그램
    프로젝트 생성과 기본 코드
    WinMain은 어디에?
    어플리케이션과 MFC의 만남
    다시 WinMain과 AfxWinMain
    2-2 실전 프로젝트
    실전 프로젝트 생성
    InitInstance
    InitInstance의 나머지는 간단하게
    2-3 메시지 구조
    메시지 큐
    MFC의 메시지 루프
    MFC의 윈도우 프로시저
    2-4 어플리케이션 종료
    프레임/뷰/도큐먼트 파괴
    ExitInstance
    핵심 포인트

    Chapter 3 RTTI와 CRuntimeClass
    3-1 RTTI
    RTTI
    3-2 CRuntimeClass
    CRuntimeClass는 어디에 쓰는 물건인가?
    CRuntimeClass 매크로
    일반화된 객체 생성
    실행 시 객체 자료형 검사
    실행 시 객체 유효성 검사
    직렬화
    CRuntimeClass 리스트
    핵심 포인트

    Chapter 4 MFC 메시지
    4-1 윈도우즈 메시지
    메시지란?
    메시지 큐를 통과하지 않는 메시지
    4-2 MFC 메시지 핸들러
    4-3 MFC 메시지 루프 다음으로의 여행
    4-4 CWnd::OnWndMsg와 메시지 맵
    4-5 메시지 종류
    윈도우 메시지
    명령 메시지
    통지 메시지
    사용자 정의 메시지
    4-6 명령 메시지와 통지 메시지는 어떤 것이 특별한가?
    4-7 메시지 리플렉션
    핵심 포인트

    Chapter 5 MFC와 스레드
    5-1 스레드
    프로세스와 스레드
    스레드 생성
    5-2 워커 스레드와 UI 스레드
    워커 스레드
    UI 스레드
    5-3 MFC 스레드
    MFC 워커 스레드
    MFC UI 스레드
    MFC 스레드 구조
    5-4 TLS(Thread Local Storage)
    Win32 TLS
    컴파일러 지원 TLS
    MFC TLS
    PROCESS_LOCAL
    5-5 _AFX_THREAD_STATE, AFX_MODULE_STATE, AFX_MODULE_THREAD_STATE
    _AFX_THREAD_STATE
    AFX_MODULE_STATE
    AFX_MODULE_THREAD_STATE
    핵심 포인트

    Chapter 6 뷰와 도큐먼트
    6-1 자료 구조 설계와 구현
    자료 구조 설계
    자료 구조 구현 - CFigure
    자료 구조 구현 - CLine
    6-2 뷰와 도큐먼트
    데이터의 생성
    데이터의 보관
    데이터를 이용한 화면 복원
    데이터를 이용한 인쇄
    데이터의 파괴
    파일 입·출력
    6-3 "WBChat" UI 구현
    메뉴, 툴바, 단축키 구현
    도형 객체 이동
    6-4 직렬화
    직렬화는 어디에서 시작되나
    직렬화의 핵심 Serialize 함수
    클래스 버전 관리는 어떻게?
    직렬화 파일 포맷
    핵심 포인트

    Chapter 7 대화상자와 서브클래싱
    7-1 CAttribute 구현
    CFigure와 CAttribute
    속성 설정 사용자 인테페이스
    7-2 대화상자 구현
    대화상자 리소스 편집
    대화상자 클래스 추가
    변수 연결
    7-3 DoDataExchange
    DoModal 안으로...
    대화상자의 90% - DoDataExchange
    DDX 함수
    DDV 함수
    값 변수와 컨트롤 변수 초기화
    [확인]과 [취소] 버튼
    7-4 컨트롤 서브클래싱
    확장된 컨트롤 클래스 구현
    확장된 컨트롤 변수 연결
    확장된 컨트롤 클래스 기능 추가
    핵심 포인트

    Chapter 8 MFC 소켓 통신
    8-1 소켓 통신
    TCP/IP 모델
    소켓이란?
    클라이언트/서버 모델
    서버 함수
    클라이언트 함수
    8-2 WSAAsyncSelect 통신 모델
    모델 이름이 왜 WSAAsyncSelect일까?
    소켓 메시지
    8-3 MFC 소켓
    MFC 소켓 클래스
    CAsyncSocket
    CAsyncSocket는 어떻게 이벤트 메시지를 처리하나?
    CSocket
    8-4 직렬화 소켓
    1대1 통신 방식으로 서버와 클라이언트 구현
    직렬화 소켓
    직렬화에서 소켓 타임 아웃 처리
    8-5 스레드와 MFC 소켓
    스레드와 MFC 소켓
    직렬화를 이용한 패킷 설계
    핵심 포인트

    Chapter 9 데이터베이스
    9-1 데이터베이스 접근 전략
    UDA
    ADO를 MFC에서 어떻게 사용하지?
    9-2 대화 상대 관리 사용자 인터페이스 구현
    분할 윈도우
    대화 상대 관리 메뉴
    대화상자 구현
    9-3 ADO
    테이블 정의
    ADO를 사용한 데이터 소스 접속
    ADO를 사용한 검색
    ADO를 사용한 수정과 삭제
    ADO를 사용한 삽입
    9-4 ODBC
    CDatabase
    CRecordset
    CRecordset는 상속해 사용한다.
    MFC에서 Stored procedure는 어떻게 호출하지?
    핵심 포인트
    반응형

    [WINAPI] SendMessage (동기) 와 PostMessage (비동기)의 차이점

    Posted on 2009. 4. 28. 18:40
    Filed Under Visual C++


    SendMessage 와 PostMessage 의는 차이점이 있습니다.
    둘다 해당 윈도우로 메시지를 보내는 기능을 가지지만 내부 동작이 다릅니다.
    PostMessage의 경우 해당 윈도우 메시지 큐에 메시지를 붙이고 바로 리턴을 하므로 동작이 비동기 적 입니다.
    즉 PostMessage를 호출한다 하여도 해당 윈도우가 다른 메시지를 처리하느라 바쁘다면 약간 처리가 늦어 지게 됩니다.
    따라서 미쳐 문자열 포인터에 접근하기전에 이쪽에서 먼저 메모리를 해제해 버리면 문자열이 날아가 버리겠죠..

    반면 SendMessage는 큐에 붙이는것이 아니라 메시지 프로시져를 직접 실행
    하게 됩니다. 즉 동기적 이죠 SendMessage를 호출하는순간 바로 해당 윈도우의 프로시져를 직접 실행하게 되므로 SendMessage를 호출한 순간에 바로 실행이 되고 리턴이 되어야 현재 호출한 곳으로 제어가 돌아옵니다.

    따라서 스택에 할당된 문자열을 포인터로 넘겨도 메모리는 해제가 되지 않습니다.
    SendMessage를 호출하는 동안은 제어가 돌아오지 않으므로 당연히 해제도되지 않게 되지요.

    굳이 불안하시다면 WS_COPYDATA 메시지에 실어서 보내는 방법도 있으니 찾아 보시면 알수 있을듯 합니다.
    <출처: 네이버 지식IN>

    반응형

    Visual Assist 간단소개 및 단축키

    Posted on 2009. 4. 28. 18:35
    Filed Under Visual C++


    [1] Visual Assist?

    * Visual Assist 는 Visual Studio를 사용하여 소스를 코딩할 때
    여러가지 도움을 주는 프로그램이다.

    [2] 사용방법

    1. 이 문서는 Visual Assist version 6.0.0.1092 를 기준으로 작성되었다.
    이 version은 Visual Studio 6.0에 대응된다.
    2. 설치는 VA6SETUP1090.exe 를 실행시키고 안내문에 따르면 된다.
    3. Visual Studio를 실행시키면 자동으로 Visual Assist가 실행된다.
    4. "ToolBar*" 라는 이름으로 Visual Assist ToolBar가 생성되므로,
    이를 통해 여러가지 설정이나 각종 기능을 사용할 수 있다.

    [3] 기능 소개

    * 이 문서에서 "Symobl"이라 함은 변수, 상수, 함수를 의미한다.
    * 각 단락의 제목은 Visual Assist Homapage에서 참조하였다.
    (
    http://www.wholetomato.com)

    1. 자동 완성(Auto Completion)
    - 소스 내에서 언제라도 Symbol의 앞글자만 치고 Tab 키를 누르면
    해당하는 글자로 시작하는 Symbol들의 리스트 박스가 뜬다.
    - 어떤 Symbol을 타이핑 하려고 할 때 글자를 치면 글자 위에 Symbol을
    추측해서 보여준다. 맞는 Symbol이 나왔을 때 Tab 키를 누르면
    자동으로 Symbol을 완성해준다.
    - t 만 치고 Tab 키를 누르면 자동으로 true 가 타이핑 된다.
    - f 만 치고 Tab 키를 누르면 자동으로 false 가 타이핑 된다.
    - a Tab assert()
    - b Tab break
    - c Tab case
    - d Tab default
    - r Tab return
    - T Tab TRUE, F Tab FALSE, A Tab ASSERT()
    - 위와 같이 C 예약어는 상황에 맞게 자동으로 타이핑 된다.

    2. 자동 수정(Auto Correction)
    - Symbol을 타이핑할 때 대문자, 소문자를 틀릴 경우 자동으로 수정된다.
    - 스펠링을 틀릴 경우 Symbol에 밑줄이 그어진다.
    - 포인터 변수에 "."을 타이핑 할 경우 자동으로 "->"로 수정된다.
    - {}과 ()에 대해 짝이 맞는 지 자동으로 검사해서 색깔로 표시해 준다.

    3. 자동 형 정보(Auto Type Info)
    - Symbol을 클릭하면 소스 창 위에 자동으로 Symbol의 정보가 표시된다.
    - 위 상황에서 정보표시 창 옆의 "goto"를 클릭하면 Symbol 선언부로
    자동 이동한다.
    - 클릭하지 않아도 Symbol 위에 마우스를 대고 있으면 정보가 표시된다.

    4. 자동 인자 정보(Auto Parameter Info)
    - 함수뿐만 아니라 메쏘드와 매크로에 대해서도 인자 정보가 표시된다.

    5. 변환(Formatting)
    - 클래스와 메쏘드에도 색을 지정할 수 있으며 일단 Visual Assist를
    실행시키면 자동으로 색 변환이 되어진 소스를 보여준다.
    - 컬럼 표시줄을 표시할 수 있다. 기본 값은 꺼져 있으므로 옵션에서
    활성화 시키면 점선으로 된 컬럼표시줄을 볼 수 있다.
    - 칼라를 사용하여 소스를 프린트 할 수 있다.

    6. 기타(Miscellaneous)
    - 멀티플 클립보드 버퍼를 지원한다. Shift+Ctrl+V 키를 이용하면
    클립보드에 카피한 내용이 나오고 그 중 선택해서 paste 할 수 있다.
    - 오른쪽 마우스 클릭으로 불러지는 메뉴가 강화된다. 예를 들면
    블럭을 지정해서 /* */ 자동으로 넣기 등이 가능해진다.
    - { 를 타이핑 하면 자동으로 } 가 타이핑 된다.

    * 이외에도 여러 기능들이 있다.

    [4] Visual Assist ToolBar

    * ToolBar의 왼쪽부터 차례대로 설명한다. 괄호 안은 단축키이다.

    1. Option(단축키 없음) : Visual Assist의 여러 기능들을 변경, 설정할 수 있다.
    2. Goto Method(Alt+M) : 메쏘드의 리스트를 보여준다.
    3. Back(Alt+Left Arrow) : 브라우져에서처럼 뒤로 돌아가기를 실행한다.
    4. Forward(Alt+Right Arrow) : 브라우져처럼 앞으로 가기를 실행한다.
    5. Open Project File(Alt+Shift+O) : 현재 프로젝트에 해당하는 파일들을
    보여주고 Open할 수 있게 해준다.
    6. Open h or cpp(Alt+O) : 현재 파일이 h이면 해당 cpp를, cpp면 해당 h 파일을 Open한다.
    7. Paste Multiple(Shift+Ctrl+V) : 멀티플 클립보드 버퍼 내용을 보여주고
    paste할 수 있게 한다.
    8. Insert Code Template(없음) : 템플릿 코드를 삽입시킨다.
    9. Context Menu(Shift+오른쪽 마우스 버튼) : 확장 Context 메뉴를 실행시킨다.
    10. Find Previous(없음) : 현재 마우스커서가 가르키고 있는 Symbol을 이전에서
    찾는다.
    11. Find Next(Alt+Shift+F3) : 현재 마우스커서가 가르키고 있는 Symbol을
    이후에서 찾는다.
    12. Comment Selection(없음) : 선택된 부분의 앞뒤에 자동으로 /* */ 를 넣는다.
    13. Comment Selection(없음) : 선택된 부분의 앞에 자동으로 // 를 넣는다.
    14. Spell Check(없음) : 선택된 부분에서 스펠링 체크를 한다.
    15. Reparse(없음) : 현재 파일을 Reparse한다. (정확한 기능을 모르겠으나
    현재 파일을 Visual Assist에 맞게 다시 변경하는 것으로 추측된다)
    16. Enable/Disable(없음) : Visual Assist를 활성화/비활성화 한다.
    17. Alt+G : 커서가 있는 위치의 함수 구현(또는 정의)부분으로 이동한다.
    출처: 네이버 검색 2003.04.03 자료
    반응형

    #define을 이용한 typedef 중복 선언 방지법

    Posted on 2009. 4. 28. 18:32
    Filed Under Visual C++


    #if !defined(int32_defined)       // or  #ifndef int32_defined
    typedef unsigned long int32;
    #define int32_defined
    #endif

    --> 선언과 함께 임의로 #define 를 해준다.
    반응형

    [ERROR] 힙이 손상되었거나 Sample1.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다.

    Posted on 2009. 4. 28. 18:29
    Filed Under Visual C++


    에러:)
    힙이 손상되었거나 Sample1.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다.

    해결:)
    서로 다른 CRT 버전을 사용했기 때문에 링크 단계에서 라이브러리 간에 기호 충돌 문제가 발생한다. 이 경우에는 CRT가 모두 일치하도록 라이브러리를 새로 구성한 다음 컴파일 하도록 한다. 라이브러리를 자신이 만들지 않은 경우에는 이 또한 여의치 않다. 이 경우에는 프로젝트 설정 대화상자에서 링크 부분에서 라이브러리 무시에 충돌이 나는 라이브러리를 추가한 다음 컴파일 하도록 한다. 종종 링크 순서 때문에 문제가 발생하기도 한다. 이 경우에는 무시 라이브러리에 모두 추가한 다음 링크 순서대로 추가 종속성에 적어두면 된다.

    DLL 때문에 가장 많이 겪는 문제 중에 하나는 new/delete 문제다. DLL과 EXE가 서로 각각 CRT를 링크한 경우(싱글 스레드, 멀티 스레드)에는 서로 다른 힙을 사용한다. 따라서 DLL에서 new한 것을 EXE에서 delete하거나, 반대로 EXE에서 new한 것을 DLL에서 delete하는 경우에 문제가 생긴다. 이 경우엔 new/delete의 위치가 동일하도록 프로그램 구조를 고치거나 아니면 DLL과 EXE 모두 멀티 스레드 DLL을 사용하도록 설정해야 한다.

    이러한 복잡한 문제들을 사전에 방지하기 위해서는 CRT를 되도록 통일해서 사용하고, DLL 경계에서 new/delete를 하지 않도록 프로그램을 작성하는 것이 좋다.

    반응형

    [Visual C++/MSDN] 도움말 항목에서 코드 예제 컴파일 방법

    Posted on 2009. 4. 28. 18:24
    Filed Under Visual C++


    방법: 도움말 항목에서 코드 예제 컴파일

    Visual Studio 2005 문서에는 사용자가 만들 수 있는 프로그램의 형식을 보여 주는 코드 예제가 들어 있습니다. Visual Studio 도움말 메뉴에서 이러한 예제 프로그램의 소스 코드를 볼 수 있습니다.

    이러한 예제 프로그램은 일반적으로 콘솔 응용 프로그램입니다. 콘솔 응용 프로그램은 완전한 프로그램으로 작성해도 크기가 크지 않기 때문에 예제로 사용하기에 적합합니다. 코드 예제는 언제라도 사용자의 프로젝트에 복사하여 붙여넣을 수 있습니다.

    이 절차에서는 도움말 항목에서 Visual C++ 코드 예제 프로그램을 찾는 방법과 이 프로그램을 컴파일하여 실행하는 방법에 대해 설명합니다.

    예제 Visual C++ 프로그램을 클립보드에 복사하려면

    1. 도움말 메뉴에서 목차를 클릭합니다.

    2. 필터링 기준 목록을 Visual C++로 설정합니다.

    3. 예제 프로그램 중 하나를 찾습니다.

      목차 영역에서 개발 도구 및 언어, Visual Studio, Visual C++프로그래밍 가이드의 트리 노드를 차례로 엽니다.

      Visual C++ Express Edition을 사용하는 경우 Visual Studio용 Express Library, Visual C++ Express Edition프로그래밍 가이드 노드를 차례로 엽니다.

    4. 도움말의 이 영역에는 많은 예제 프로그램이 있습니다.

      예를 들어, C++로 .NET 프로그래밍Windows 작업을 열고 방법: 시작 후 경과한 시간 검색 항목을 선택합니다.

      이렇게 하면 환경이 어떻게 구성되어 있는지에 따라 도움말 브라우저나 Visual Studio의 창에 해당 항목이 열립니다.

    5. 코드 복사 단추를 클릭하여 예제 프로그램을 클립보드에 복사합니다.

    6. 클립보드에 소스 코드를 복사하면 다음 중 하나를 수행할 수 있습니다.

      • Visual Studio에서 현재 프로젝트에 새 .cpp 파일을 추가하고 소스 코드를 이 파일에 붙여넣은 다음 방법: Visual Studio에서 CLR를 대상으로 하는 C++ 프로그램 컴파일 항목의 설명에 따라 Visual Studio 개발 환경에서 이 파일을 컴파일할 수 있습니다.

      • 소스 코드를 텍스트 편집기에 붙여넣고 확장명으로 .cpp를 사용하여 이를 저장한 다음 아래 설명에 따라 명령줄에서 이 파일을 컴파일할 수 있습니다.

    코드 컴파일

    예제 프로그램은 간단한 Visual C++ 콘솔 응용 프로그램이므로 아래 절차에서 설명하는 방법에 따라 명령줄에서 이를 컴파일하는 것이 더 쉽습니다.

    클립보드에 복사한 코드 예제를 컴파일하려면

    1. 시작 단추를 클릭하고 모든 프로그램, Microsoft Visual Studio 2005, Visual Studio Tools를 차례로 가리킨 다음 Visual Studio 2005 명령 프롬프트를 클릭하여 Visual Studio 명령 프롬프트 창을 엽니다.

    2. 명령 프롬프트에 다음과 같이 입력하고 Enter 키를 누릅니다.

      notepad timeelapsed.cpp

      새 파일을 만들지 확인하는 메시지가 나타나면 를 클릭합니다.

    3. 편집 메뉴에서 붙여넣기를 클릭하여 복사한 프로그램을 메모장에 추가합니다.

    4. 파일 메뉴에서 저장을 클릭합니다.

    5. 파일 메뉴에서 끝내기를 클릭하여 메모장을 종료합니다.

    6. 명령줄 프롬프트에 다음과 같이 입력하고 Enter 키를 누릅니다.

      cl /clr timeelapsed.cpp

    7. timeelapsed.exe 프로그램을 실행하려면 timeelapsed를 입력하고 Enter 키를 누릅니다.

      프로그램이 실행되고 Windows를 마지막으로 시작한 이후 경과된 시간이 표시됩니다.

    8. exit를 입력하고 Enter 키를 눌러 명령 프롬프트 창을 닫습니다.

    참고 항목

    반응형

    App에서 Internet Explorer 실행

    Posted on 2009. 3. 25. 13:37
    Filed Under Visual C++

    프로그램에서 URL을 오픈하도록 해야한다. 어떻게 할지 찾아보자.
    필요한 사항부터 정리해보고,
    - 이미 열려있는 페이지(URL)이면 같은 페이지로 열기 (target = _self)
    - IE6, IE7 인지 체크하는 방법
    - IE6, IE7 각각일때 열기 방식의 차이

    1. shell cmd인 explorer를 사용해서 Open해볼까?
    cmd창에서 다음같이 실행해서 URL을 오픈할 수 있다.
    > explorer http://www.yahoo.co.kr
    "http://"가 붙으면 IE가 실행되고 폴더패스이면 폴더를 오픈한다.


    2. IE Control로 직접 제어할 수 있단다.
    IE6, IE7이 방법이 다르다.
    Vista/IE7에서는 IE구조에 보호모드(?)가 들어가 있어서 까다롭단다.

    CoCreateInstance를 통한 IE7/Vista의 IWebBrowser2 interface 얻기
    http://byung.egloos.com/2842249



    반응형

    VC++ 6.0을 쓰지 말아야하는 이유

    Posted on 2009. 3. 25. 10:58
    Filed Under Visual C++

    출처: http://minjang.egloos.com/1783328 < 덧글도 참조!! 두둥~!

    VC++ 6.0을 쓰지 말아야하는 이유

    트랙백: Visual Studio 6.0를 계속 쓸까? 아니면 Visual Studio 2008로 바꿔?

    2008년 3월인 지금까지도 여전히 많은 프로젝트들이 10년 전에 출시된 VC++ 6.0으로 개발하고 있다는 사실이 다소 놀랍고 충격적이기까지 하다. 많은 분들이 토를 단다. 그런데 직접 십만 라인의 VC6 프로젝트를 2003년,VS 2003으로 이전한 경험이 있는 나로서는 그저 게을러서, 귀찮아서 라는 변명으로 밖에 들리지 않는다. 정말로 VC++ 6.0을 써야만 하는 절대절명의 이유가 있는지 정말 궁금하다. 왜 VC++ 6.0을 쓰지 말고 최소 VS 2005을 써야하는지 몇 가지만 써보자. (단, 이 이야기는 .NET을 사용하지 않는 Win32 기반의 C/C++ 프로젝트에만 적용된다.)


    1. 보다 안전한 프로그래밍

    2001년 온 세상을 골치아프게 했던 Code Red Worm을 기억할 것이다. 이건 대표적으로 heap buffer overflow의 결과인데, 이건 사소한 프로그래밍 실수 혹은 미비한 체크로 발생한다. 예를 들어, strcpy 같은 함수가 대표적이다. strcpy는 아시다시피 달랑 두 개의 스트링 인자만 받고 길이를 입력 받지 않는다. 그건 두 인자 모두 NULL로 안전하게 끝나는 것을 가정하기 때문이다. 그런데 의도적으로 할당된 버퍼보다 더 많은 문자열을 입력할 경우? 최악의 경우 재앙이 벌어질 수 있다. 실제 대부분의 버퍼 오버플로우는 이렇게 발생한다. VC++ 6.0에서는  strcpy를 써도 아무런 경고 따위 없다. 그러나 VS 2005 이상에서는 이런 함수는 쓰면 위험하다고 경고를 띄운다.

    xxx.cpp(66) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.


    2. 유니코드 프로그래밍

    아직까지도 유니코드가 아닌 MBCS로 시작하는 (윈도우) 프로그래머가 있으면 이건 기본도 모르는 사람이다. "아직 저희 제품이 윈도우 98을 지원 해야해서..." 라는 변명도 통하지 않는다. 그럴 경우에는 윈도우 95/98을 위한 Unicode Layer를 쓰면 된다. VS 2005에서 프로젝트를 하나 생성하면 디폴트가 유니코드이다. 이제 구닥다리 아스키 MBCS 기반의 프로그램을 짜야할 이유가 전혀 없다. 윈도우 NT 커널은 모두 유니코드로 짜여있어서 유니코드를 바로 쓰는 것이 성능에도 좋다. 예를 들어, CreateWindow라는 함수는 실제로 CreateWindowA라는 아스키 버전과 CreateWindowW라는 유니코드 버전이 있는데, 윈도우 NT 커널에서는 W 버전만 구현이 되어있다. 그리고 A 버전 함수가 불리면 입력 받은 스트링을 모두 유니코드로 바꾸는 과정을 거친 뒤, W를 실행시킨다. 참고로 윈도우 CE는 오직 유니코드만 지원한다. 따라서 아스키, MBCS를 써야할 이유가 이제는 없다. "윈도우 98 사용자들을 그래도..." 닥쳐라. 그냥 무시해라. 내 블로그 통계에 아예 Windows 98은 잡히지도 않는다.

    영문 윈도우에서 non-Unicode 세팅을 영어로 했을 때, 여전히 ???와 같은 글씨가 보이는 프로그램들을 보면 한숨만 팍팍 나온다. 유니코드로 전환하는 것이 그렇게 어려운 것도 아니다. 사실, 제대로 공부 좀 했는 윈도우 프로그래머라면 10년 전 부터 이미 TCHAR, _T(x)와 같이 Unicode prepared된 코드를 만들었어야만 했다. 그러나 위에서도 말했듯이 이제는 모두 NT 기반 커널을 사용하기 때문에 TCHAR을 사용할 필요도 없다. 그냥 바로 wchar_t, L"Hello, World!"로 하면 된다.

    반드시 알아야할 내용: http://eslife.tistory.com/entry/유니코드로-개발하기


    3. 보다 뛰어난 인텔리센스

    VC++ 2008은 아직도 안 써봐서 잘 모르겠지만, VC++ 2005의 인텔리센스만 해도 상당히 우수한 편이다. 물론 C#에서 지원되는 인텔리센스에 비하면 한참이나 모자라지만 기타 다른 모든 C/C++ 인텔리센스 중에서는 최고의 성능을 자랑한다고 확신한다 (이클립스, 소스인사이트 등등 모두 능가함). VC6 에서는 인텔리센스 기능이 초창기 버전이라 부족한 점이 매우 많았다. 대표적으로 #define으로 정의된 것들은 목록에 뜨지 않는다. 그리고 2003에 비해서도 성능이 많이 개선이 되었다. 여기에 적기에는 너무 장황해질 것 같아 생략하겠지만 2003에서는 처리가 안되어서 아쉬웠던 것이 2005에서 지원이 된 케이스가 있다. (이거 확인하고 바로 VS 2003 언인스톨)

    VC++ 6.0 (사실 난 2002년부터 쓰지 않았다)을 쓸 때는 Visual Assist가 필수품이었는데 이제는 이걸 쓸 이유가 없다. Visual Studio가 지원하는 인텔리 센스만 해도 충분하기 때문이다.


    4. STL의 (거의) 완벽한 지원

    STL을 사용한다면 당장에 VC++ 6.0은 언인스톨 해야한다. 역시 eslife님이 아주 잘 정리를 해주셨기에 링크로 대체: http://eslife.tistory.com/entry/Visual-Studio-버전-별-STL-지원. 링크 글에도 나오지만 VS 2005의 STL 디버깅은 환상적이다. 예전에 STL 내용물 보기 위해 계속 노가다 뛰었던 걸 기억하면 눈물 날 정도다 (gdb에서는 dump 함수를 짜서 실행시키면 되긴 하지만 여전히 불편했다).


    5. 뛰어난 IDE 매크로 사용

    VC++ 6.0에서도 매크로가 되긴 된다. 그러나 Visual Studio .NET (7.0 버전)에서 부터 매크로가 매우 강력해졌다. IDE 하나가 DTE라는 객체로 접근이 되고 모든 IDE 객체 및 요소가 접근이 되고 매크로화 할 수 있다. 대표적으로 예를 하나 적어보면 .cpp와 .h를 연결해주는 매크로도 쉽게 만들 수 있다.


    6. 더 훌륭해진 컴파일러

    컴파일러만 놓고봐도 VS 2005 이상을 써야할 이유가 충분하다. MS compiler extension이긴 하지만 편리한 키워드도 추가가 되었으며, profile-guided 최적화도 가능하고, 컴파일러 메세지도 보다 친절해졌으며, OpenMP도 그냥 지원이 된다. C99 기능들은 지원하지는 않지만 훨씬 C++ 표준에 부합된 프론트엔드를 가지고 있다.


    7. 더 괜찮아진 IDE

    IDE만 놓고 보면 VC++ 6.0보다 많이 무겁다. 그러나 메모리 요즘 엄청나게 저렴하고 듀얼 코어 CPU도 저렴하니 그거 달면 가볍다. 회사에서 좋은 컴퓨터 안 사주면 회사 때려치던가 아니면 자기돈 들여서라도 좋은 컴퓨터로 바꿔야 한다. 남들 3분만에 컴파일할 것, 5분 동안 컴파일하면 그건 시간 낭비. 남은 2분 동안 최소 잠자거나 인터넷 서핑해도 남는 장사다. 그러니 최신 Visual Studio가 메모리 많이 먹는다는 것은 그다지 핑게거리가 되지 않는다.

    VC++ 6.0의 IDE는 뭐랄까 애증이 교차한다. 희한하게도 이 IDE는 MFC로 만들어져 있어서 많은 호기심을 자아냈다. (단순하게 Spy++로 확인해보면 Afx:... 로 시작하는 Window Class Name이 확인 가능하다) 아마 마이크로소프트 내부에서 만든 프로그램 중 MFC를 쓴 것은 VC6과 Wordpad 정도가 아닐까? 그러나 VC++ 6.0의 IDE는 그다지 우수하지 않다. 일관성이 없다고 할 수 있다. 반면, Visual Studio .NET 부터는 모든 언어들이 공통적인 IDE로 통합이 되어 훨씬 일관성이 있는 UI로 바뀌었다. 물론 "ClassWizard가 사라졌어요!" 라는 비명이 잠시 들리지만 걱정 마시라, 다 있다. (물론 요즘 컴퓨터에서는 매우 가벼워진 VC6 덕택에 이 녀석을 에디터로 쓰시는 분들도 봤다)

    VS 2003 시절까지만 해도 디버깅 심볼 서버 쓰기 위해서 삽질 좀 해야했던 것도 VS 2005에서는 그냥 된다. 또, VS 2003 까지만 해도 툴바 설정, 폰트 색깔 설정을 새 컴퓨터로 이동하기 위해 레지스트리도 백업해야하고 파일들도 카피해야했던 것에 비해, 세팅을 이전할 수 있는 기능을 built-in으로 지원한다. Team 버전은 사용하지 않았지만 거기에는 프로파일링, 유닛 테스트 등이 모두 포함되어있다고 한다. 마지막으로 VC6의 16색 썰렁한 아이콘에 비해 2005의 256색 아이콘은 더 이쁘다...


    8. 멀티 코어의 사용

    좀 와전된 내용이 있는 것 같은데, 최신 VC++ 컴파일러가 멀티 코어를 인식해서 뭔가 새로운 수준의 최적화나 컴파일을 하는 것은 아니다. 단순히 컴파일을 할 때, 멀티 코어를 다 활용하여 컴파일 시간을 단축시키는 것에 불과하다. 그래도 어쨌든 요즘 거의 기본인 듀얼 코어 환경에서 보다 빠르게 컴파일을 할 수 있다. VS 2005는 이 기능이 사실 미약해서 단순히 독립적인 두 프로젝트를 동시에 컴파일하는 수준이었는데, VS 2008은 모르겠다. 사실 컴파일은 그 자체가 embarrassingly parallel한 작업이라서 파일 수준으로 동시에 병렬적으로 컴파일을 할 수 있다.


    9. MFC/ATL의 변화

    VC++ 2008에는 제법 많은 MFC의 변화가 있다. 그러나 VS.NET부터도 변화가 적지 않게 있었다고 볼 수 있다. 바로 MFC와 ATL 중 공통적인 클래스들은 이들에 의존적이지 않고 사용할 수 있도록 된 것이다. 대표적으로 CString을 들 수 있다. VC++ 6에서는 CString 하나만 쓰려고 해도 MFC를 들고 다녀야만 했다. 그러나 버전 7, 그러니까 VS.NET 부터 (mfc70*.dll)는 CString, CRect, CPoint와 같은 타입들은 죄다 독립적으로 빠져 일반적인 Win32 프로젝트에도 붙여 쓸 수 있다.


    또 뭐가 있을까. 정말 VC6을 아직도 쓰는 사람들이 있으면 도시락 싸가면서 말리고 싶다. 그 만큼 얻는 이득이 많다. 딱 하나 불편한 점이 있다면, MFC/ATL dll을 따로 배포해야 한다는 점 정도만 있을 것이다. 글쎄다. 정말 어떤 점이 VC6에서 VS 2005 혹은 VS 2008의 이전을 가로 막는지 궁금하다. VS 2008의 C/C++ 기능은 보다 많이 강화가 되었기 때문에 바꾸어야할 이유는 더 많아졌다.

    운영체제야 비스타를 쓰라고 강요할 이유가 없다. 그러나 개발툴은 보다 안전하고 보다 빠르고 보다 효율적인 개발을 할 수 있다는 점에서 새 버전이 나오면 적극적으로 이전할 필요가 있다.

    과거 십만 라인 프로젝트들을 바꿀 때, 쉽지는 않았다. 그런데 일주일 정도면 충분히 이전할 수 있었다. 오히려 컴파일러가 더 좋아지고 CString의 특정 함수의 프로토타입이 더 좋게 바뀌어서 잠재된 버그까지 잡을 수 있었다. 반복적인 노가다가 필요했지만 충분히 보상되고도 남는다. 그래서 더더욱 최소 VS 2005의 업그레이드를 추천한다.

    VS2008 New UI Sample: Get a feel for the new MFC features using samples

    관련링크:
    Visual Studio 버젼별 STL 지원  ☞ 2005부터 사용이 수월해졌단다. 디버깅 모드에서 값이 제대로 보인다! 오굿!
    Visual Studio 6.0를 계속 쓸까? 아니면 Visual Studio 2008로 바꿔?

    반응형

    [VSS] file 'XXX' access denined

    Posted on 2008. 12. 4. 10:24
    Filed Under Visual C++

    갑자기 Check In 이 안된다.
    여기저기 찾아봐도 폴더를 write 속성 주라는둥 계정에 write권한이 없다는둥..

    최초 올렸던 파일을 백업하고,
    VSS에서 해당 파일을 삭제(delete)하고
    다시 업로드(create) 한 후,
    백업파일을 copy해서 새로 create된 파일내용을 덮어씌웠다. 물론 Check Out 하고나서..

    중간 History는 날라갔지만 ㅠㅠ
    이제 Check In은 된다.

    갑자기 왜 이러시나; ㄷㄷㄷ
    반응형

    문자열 :: 각종 문자열변환 방법모음.. TCHAR <-> char <-> Ascii <-> CString

    Posted on 2008. 11. 14. 15:38
    Filed Under Visual C++


    TCHAR --> CString

    CStirng sSring;
    TCHAR sTString = _T("가나다");

    sString.Format(_T(%s), sTString);


    CString --> TCHAR

    TCHAR * des = new TCHAR[sString.GetLength() + 1]; // 1은 NULL을 위한 여유공간
    _tcscpy(des, NowSaving.GetBuffer(0));


    String --> UTF - 8

    char buffer[20];
    WCHAR Unicode[20];
    char UTF8code[20];

    int nUnicodeSize = MultiByteToWideChar(CP_ACP, 0, lpID, strlen(lpID),
                                           Unicode, sizeof(Unicode));

    int nUTF8codeSize = WideCharToMultiByte(CP_UTF8, 0, Unicode, nUnicodeSize,
                                            UTF8code, sizeofUTF8code), NULL, NULL);

    nUnicodeSize = MultiByteToWideChar(CP_UTF8, 0, UTF8code, nUTF8codeSize,
                                       Unicode, sizeof(Unicode));

    memcpy(buffer, UTF8code, nUTF8codeSize);

    이렇게 하면 buffer에 UTF-8로 변환

    UTF-8 --> Unicode

    void CCPimFONEDevice::UTF82UNICODE(char * strSrc, wchar_t *strTarget)
    {
      int nSize = MultiByteToWideChar(CP_UTF8, 0, strSrc, -1, 0, 0);
      MultiByteToWideChar(CP_UTF8, 0, strSrc ,  -1 , strTarget, nSize);
    }


    char --> TCHAR

    char charBuff[]="test";
    TCHAR szUniCode[256]={0,};
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, charBuff, strlen(charBuff),
                        szUniCode, 256);


    CString --> char*

    //EVC는 기본적으로 유니코드를 사용하기 때문에 CString을 char*로 변환할 수 없음..
    nToWrite = lpByte.GetLength();
    char *pAnsiString = new char[nToWrite+1];

    memset(pAnsiString,0,nToWrite+1);
    wcstombs(pAnsiString, lpByte, nToWrite+1); // wchar_t배열을 multibyte 문자열로 변환한다.


    =====================================================================================

    유니코드로 저장하기..

     TCHAR szPath[] = _T("1234567890");
     int nLen = _tcslen(szPath);
     CFile file(_T("D:\\Down\\test.xml"), CFile::modeCreate|CFile::modeWrite);
     TCHAR szTmp[2];
     WORD wd = 0xfeff;
     memcpy(szTmp, &wd, 2);
     file.Write(szTmp, 2);
     file.Write(szPath, nLen*sizeof(TCHAR));
     file.Close();


    여기서 핵심은 FEFF 이다.
    유니코드의 식별자란 것인데, 파일의 처음부분에 넣어주면 유니코드라고 선언하는 셈이 된다.
    (원래 규격은 FFFE 일것이지만, IBM PC 는 리틀엔디언 방식이므로 바이트 위치를 반대로 두어야 한다.)

    메모장에 "abcd" 라고 입력하고 각각의 타입으로 저장후 헥사에디터로 열어보았다.
    (코드값 사이의 스페이스는 무시해서 보면 된다. 가령, "FF FF" 는 2바이트일뿐이다.)

    참고로 'a' 의 아스키값은 61.

    ASCII: (순수한 값만 존재한다.)
    61 62 63 64

    UNICODE(Little Endian): (헤더가 존재하고 한바이트 알파벳이 두바이트로 표현되었다. 가령 'a' 는 61 00)
    FF FE 61 00 62 00 63 00 64 00

    UNICODE(Big Endian): (리틀엔디안과 다른점은 두바이트씩의 짝이 앞뒤로 바뀐점뿐. 가령 'a' 는 00 61. 헤더도 앞뒤가 바뀐점에 유의.)
    FE FF 00 61 00 62 00 63 00 64

    UTF-8 : (헤더가 3바이트란것에 유의. 알파벳은 1바이트로 표현되었다.)
    EF BB BF 61 62 63 64



    UTF-8 로저장하기...

    //UTF-8 로 저장하기
    int UnicodeToUtf8(TCHAR* pUnicode, char** pUtf8)
    {
     int len = ::WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pUnicode, -1, NULL, 0, NULL, NULL);
     *pUtf8 = new char[len];
     ::WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pUnicode, -1, *pUtf8, len, NULL, NULL);

     return len;
    }
     // UTF 0xEFBBBF
     TCHAR szTmp[2];
     WORD wd = 0xbbef;
     memcpy(szTmp, &wd, 2);
     file.Write(szTmp, 2);
     BYTE byte = 0xbf;
     memcpy(szTmp, &byte, 1);
     file.Write(szTmp, 1);
     char *pUtf8 = NULL;
     nLen = UnicodeToUtf8(szXML, &pUtf8);
     file.Write(pUtf8, nLen-1);
     delete []pUtf8;


    이번엔  메모장에 "한글" 라고 입력하고 각각의 타입으로 저장후 헥사에디터로 열어보았다.

    참고로 '한글' 의 아스키값은 C7 D1 B1 DB.

    ASCII: (순수한 값만 존재한다.)
    C7 D1 B1 DB

    UNICODE(Little Endian): (헤더는 알파벳과 같지만 내용부분의 코드가 확 바껴 버렸다! 당연한 결과인가.)
    FF FE 5C D5 00 AE

    UNICODE(Big Endian): (마찬가지로 한쌍씩의 바이트 위치가 바꼈다.)
    FE FF D5 5C AE 00

    UTF-8 : (헤더가 3바이트란것은 똑같지만 이게 어떻게 된일? 한글자에 3바이트가 사용되었다! 흐음... 이것은 좀 놀라운 일이다.)
    EF BB BF ED 95 9C EA B8 80


    출처: http://set2happy.tistory.com/201

    반응형

    About

    by 쑤기c

    반응형