ATL¸¸ À» »ç¿ëÇØ ÀÛ¼ºÇÑ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥¿¡¼­´Â  ¸Þ½ÃÁö ·çÇÁ¸¦SDK½ºÅ¸ÀÏ·Î ½è½À´Ï´Ù.

MSG msg;

while(GetMessage(&msg, NULL, 0, 0) > 0){

    TranslateMessage(&msg);

    DispatchMessage(&msg);

}

                      


WTL¿¡´Â  ¸Þ½ÃÁö
·çÇÁ¸¦ ĸ½¶È­Çϱâ À§Çؼ­CMessageLoop¶ó°í Çϴ Ŭ·¡½º°¡ ÁغñµÇ¾î ÀÖ½À´Ï´Ù. ¿©±â¿¡¼­´Â ÀÌCMessageLoopŬ·¡½º¸¦ »ç¿ëÇØ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥ °íÃÄ ¾¹´Ï´Ù. µ¡ºÙ¿© À̹øÀ¸·ÎºÎÅÍWTLÀÇ atlcrack.hÇì´õ·Î Á¤Àǵǰí ÀÖ´Â ¸Þ¼¼Áö Å©·¡Ä¿¸¦ »ç¿ëÇÕ´Ï´Ù.

// stdafx.h¾È

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;  // CComModuleÀ¸·ÎºÎÅÍCAppModule¿¡ ¿Å°Ü³õ´Â

#include <atlwin.h>

 

#include <atlcrack.h> // WTL¸Þ¼¼Áö Å©·¡Ä¿¸¦ »ç¿ëÇϱâ (À§ÇØ)¶§¹®¿¡

                      

 

// MainWindow.hµ¿¾È

class CMyWindow : public CWindowImpl<CMyWindow>

{

public:

    // À©µµ¿ì Ŭ·¡½º¸íÀ» µî·Ï

    DECLARE_WND_CLASS(_T("Hello"));

 

private:

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMyWindow)

        MSG_WM_PAINT(OnPaint)

        MSG_WM_DESTROY(OnDestroy)

    END_MSG_MAP()

 

    void OnPaint(HDC /*hDC*/){

        PAINTSTRUCT ps;

        HDC hDC = BeginPaint(&ps);

        RECT rect;

        GetClientRect(&rect);

        DrawText(hDC, _T("Hello, ATL/WTL"),

            -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

        EndPaint(&ps);

    }

 

    void OnDestroy(){

        PostQuitMessage(0);

    }

};

                      

 

// hello.cpp³»

#include "stdafx.h"

 

#include "MainWindow.h"

 

CAppModule _Module;  // CComModule·ÎºÎÅÍCAppModule¿¡ ¿Å°Ü³õ´Â

 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)

{

    _Module.Init(NULL, hInstance);

 

    CMessageLoop theLoop;

    _Module.AddMessageLoop(&theLoop);

 

    // µ¶ÀÚ À©µµ¿ì¸¦ ÀÛ¼º

    CMyWindow wnd;

    wnd.Create(NULL, CWindow::rcDefault,

        _T("Hello, ATL/WTL"), WS_OVERLAPPEDWINDOW | WS_VISIBLE);

 

    int nRet = theLoop.Run();

 

    _Module.RemoveMessageLoop();

 

    _Module.Term();

 

    return nRet;

}

                      


¡¡¿ì¼± stdafx.h¾È¿¡¼­´Â CMessageLoopŬ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­atlapp.hÇì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù. ±×¸®°í CMessageLoopŬ·¡½º´ÂCAppModuleŬ·¡½º¿¡ ÀÇÇØ °ü¸®µÇ±â (À§ÇØ)¶§¹®¿¡  Áö±Ý±îÁö ±â¼úÇØ ¿ÂCComModuleŬ·¡½º¸¦CAppModuleŬ·¡½º¿¡ ¿Å°Ü³õ½À´Ï´Ù.  CAppModuleŬ·¡½ºµµ atlapp.h Çì´õ¿¡ ¼±¾ðµÇ°í Àֱ⠶§¹®¿¡ CAppModuleŬ·¡½º¸¦ »ç¿ëÇϱâ Àü¿¡atlapp.hÇì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù. ÇÑÃþ ´õWTLÀÇ ¸Þ¼¼Áö Å©·¡Ä¿¸¦ »ç¿ëÇϱâ À§Çؼ­ atlcrack.hÇì´õ¸¦ ÀÎŬ·çµå Çϰí ÀÖ½À´Ï´Ù.

¡¡CMyWindowŬ·¡½º¿¡¼­´Â  ¸Þ¼¼Áö¿Í ¸Þ¼¼Áö Çڵ鷯¸¦ ¹­±â À§Çؼ­ WTLÀÇ ¸Þ¼¼Áö Å©·¡Ä¿¸¦ »ç¿ëÇϰí ÀÖ½À´Ï´Ù. º»¹®¼­¿¡¼­´ÂATL3.0À» »ç¿ëÇϰí ÀÖ±â)¶§¹®¿¡  BEGIN_MSG_MAP¸¦BEGIN_MSG_MAP_EX¿¡ ¿Å°Ü³õ°í ÀÖ½À´Ï´Ù.

¡¡_tWinMain()¾È¿¡¼­´Â ,CMessageLoopŬ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇØ  ±×°ÍÀ»CAppModule::AddMessageLoop()·Î CAppModule³»ºÎÀÇ ¸Ê¿¡ Ãß°¡Çϰí ÀÖ½À´Ï´Ù. ¸Þ½ÃÁö ·çÇÁ´ÂCMessageLoop::Run()¿¡ ÀÇÇØ ½ÇÇàµÇ¾î ÇÊ¿ä¾ø°Ô µÈ ¸Þ½ÃÁö ·çÇÁ´ÂCAppModule::RemoveMessageLoop()¿¡ ÀÇÇØ CAppModule³»ºÎÀÇ ¸ÊÀ¸·ÎºÎÅÍ »èÁ¦ÇÕ´Ï´Ù.

¡¡ÀÌ¿Í °°ÀÌWTL¿¡¼­´Â ,CMessageLoopŬ·¡½º¿¡ ÀÇÇØ ĸ½¶È­µÈ ¸Þ½ÃÁö ·çÇÁ¸¦  CAppModuleŬ·¡½º¿¡ ÀÇÇØ °ü¸®Çϰí ÀÖ½À´Ï´Ù.  CAppModuleŬ·¡½ºÀÇ ³»ºÎ¿¡¼­´Â  ¸Þ½ÃÁö ·çÇÁ¿Í °æÇâ threadID¸¦ ¼¼Æ®·Î ÇØ ¸Ê¿¡ µî·ÏÇϰí ÀÖ½À´Ï´Ù. Áï , ±Û·Î¹ú ¼±¾ðµÈCAppModuleŬ·¡½ºÀÇ ÀνºÅϽºÀÎ_ModuleÀº  º¹¼öÀÇ thread³»¿¡ ÀÖ´Â ¸Þ½ÃÁö ·çÇÁ¸¦ ÀÏ¿ø °ü¸®ÇÏ°Ô µË´Ï´Ù.