°¡. Ãʱ⠼³Á¤

´ç±ÙÀº ½ÇÇàÆÄÀÏ È¥ÀÚ¼­ ½ÇÇàµÇ´Â ´Üµ¶ ½ÇÇàÆÄÀÏÀ̸ç ÀÏüÀÇ ºÎ¼ÓÆÄÀÏÀÌ ¾ø´Ù. ±×·¡¼­ °ü¸®Çϱâ´Â Æí¸®ÇÑ ÀÌÁ¡ÀÌ ÀÖÁö¸¸ ´ç±ÙÀÌ ½ÇÇàµÇ±â À§ÇÑ È¯°æÀ» ¸¸µé¾îÁÖ´Â ¼³Ä¡ ÇÁ·Î±×·¥ÀÌ µû·Î ¾ø¾î ½º½º·Î ȯ°æÀ» ¸¸µç ÈÄ ½ÇÇàÇØ¾ß ÇÑ´Ù. ÇöÀç »óȲ¿¡¼­ ´ç±ÙÀÇ ½ÇÇà ȯ°æÀ» ÃʱâÈ­ÇÏ´Â ÄÚµå´Â SOption::Init ÇÔ¼öÀ̸ç ÀÌ ÇÔ¼ö¿¡¼­ ÃʱâÈ­ÇÑ Option ±¸Á¶Ã¼ÀÇ ³»¿ë´ë·Î µ¿ÀÛÇÑ´Ù.

±×·±µ¥ ´ç±ÙÀÇ ¿É¼Ç Áß bExplorerPopup ¿É¼ÇÀº ´Ù¸¥ ¿É¼Ç°ú´Â ´Þ¸® ½Ã½ºÅÛ ±¸¼º¿¡ º¯°æÀ» °¡ÇÑ´Ù´Â ¸é¿¡¼­ Á» Ư¼öÇÏ°Ô ÃʱâÈ­ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. µµ±¸/±âº» ¼³Á¤ Ç׸ñ¿¡¼­ ÀÌ °ªÀ» ÀÚÀ¯·Ó°Ô º¯°æÇÒ ¼ö ÀÖÁö¸¸ ÀÌ °ªÀÇ µðÆúÆ®°¡ TRUEÀ̸ç OnCreate¿¡¼­ ÀÌ ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é RegisterPopupÀ» È£ÃâÇϹǷΠÃÖÃÊ ½ÇÇà½Ã ÀÌ ¿É¼ÇÀÌ ¹«Á¶°Ç Àû¿ëµÇ¾î ¹ö¸°´Ù. ½Ã½ºÅÛÀÇ ±¸¼º¿¡ ¿µÇâÀ» ÁÖ´Â ¿É¼ÇÀÓ¿¡µµ ºÒ±¸ÇÏ°í »ç¿ëÀÚÀÇ ¸í½ÃÀûÀÎ µ¿ÀǸ¦ ¹ÞÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.

ÀÌ ¿É¼ÇÀÇ µðÆúÆ®¸¦ FALSE·Î ÃʱâÈ­ÇÏ°í ¿øÇÒ °æ¿ì¸¸ ¼³Á¤ ´ëÈ­»óÀÚ¿¡¼­ ÀÌ ¿É¼ÇÀ» ¼±ÅÃÇϵµ·Ï ÇÒ ¼öµµ ÀÖÁö¸¸ ÀÌ·¸°Ô µÇ¸é »ç¿ëÀÚµéÀÌ ÀÌ ±â´ÉÀÇ Á¸Àç ¿©ºÎ¸¦ ¹Ìó ¾ËÁö ¸øÇÒ È®·üÀÌ ³ô´Ù. ±×·¡¼­ µðÆúÆ®´Â TRUE·Î À¯ÁöÇ쵂 ÃÖÃÊ ½ÇÇà½Ã »ç¿ëÀÚ¿¡°Ô ÀÌ ±â´ÉÀÇ »ç¿ë ¿©ºÎ¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ Á¦°øÇϱâ·Î Çß´Ù. °á±¹ ¼³Ä¡ ÇÁ·Î±×·¥ÀÌ ÇØ¾ß ÇÒ ÀÏÀ» ÀÚ½ÅÀÌ ½º½º·Î ÇÏ°Ô µÇ´Â ¼ÀÀÌ´Ù. ÃÖÃÊ ½ÇÇà½Ã ´ÙÀ½ ´ëÈ­»óÀÚ¸¦ º¸¿©ÁØ´Ù.

ÀÌ ´ëÈ­»óÀÚ´Â Ãʱ⠼³Ä¡ ¿É¼ÇÀ» ÀԷ¹޴ ¸ñÀû ¿Ü¿¡µµ óÀ½ »ç¿ëÀÚ¸¦ À§ÇÑ Ä£ÀýÇÑ(?) ȯ¿µ ¸Þ½ÃÁö¿Í ÇÔ²² ¼îÆ®ÄÆ, ¾ÆÀÌÄÜ µîÀ» »ý¼ºÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÃÖÃÊ ½ÇÇà½Ã ÇÑ ¹ø¸¸ ³ªÅ¸³ª¹Ç·Î »ç¿ëÀÚ¸¦ ±ÍÂú°Ô ÇÏÁö´Â ¾Ê´Â´Ù. °¡¿îµ¥ ¿¡µðÆ®¿¡´Â óÀ½ »ç¿ëÀÚ¸¦ À§ÇÑ °£´ÜÇÑ ¾È³»¹®À» º¸¿©ÁÙ °ÍÀÌ¸ç ¾Æ·¡ÂÊÀÇ ¼¼ ¿É¼ÇÀÌ ¼³Ä¡ ¿É¼ÇÀÌ´Ù. ´ÙÀ½ ÇÔ¼öµéÀº ÀÌ ¼³Ä¡ µ¿ÀÛÀ» À§ÇÑ À¯Æ¿¸®Æ¼ ÇÔ¼öµéÀ̸ç Util.cpp ÆÄÀÏ¿¡ ÀÛ¼ºÇÑ´Ù.

 

HRESULT MyCreateShortCut(LPCSTR szSrcFile, LPSTR szLnkFile, LPSTR szArgument, LPSTR szDesc)

{

     HRESULT hr;

     IShellLink *pSl;

     IPersistFile *pPf;

     WCHAR wszLnkFile[MAX_PATH]={0,};

 

     hr=CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,

          IID_IShellLink, (void **)&pSl);

     if (FAILED(hr))

          return E_FAIL;

 

     pSl->SetPath(szSrcFile);

     pSl->SetDescription(szDesc);

     pSl->SetArguments(szArgument);

 

     hr=pSl->QueryInterface(IID_IPersistFile, (void **)&pPf);

     if (FAILED(hr)) {

          pSl->Release();

          return E_FAIL;

     }

 

     MultiByteToWideChar(CP_ACP, 0, szLnkFile, -1, wszLnkFile, MAX_PATH);

     hr=pPf->Save(wszLnkFile, TRUE);

 

     pPf->Release();

     pSl->Release();

     return hr;

}

 

void MyGetSpecialFolderPath(HWND hWnd, int nFolder, TCHAR *szPath)

{

     LPITEMIDLIST pidl;

     LPMALLOC pMalloc;

 

     SHGetSpecialFolderLocation(hWnd,nFolder,&pidl);

     SHGetPathFromIDList(pidl, szPath);

     SHGetMalloc(&pMalloc);

     pMalloc->Free(pidl);

     pMalloc->Release();

}

 

COM °´Ã¼¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ´Ù¼Ò ¾î·Á¿ö º¸ÀÏ ¼öµµ Àִµ¥ ÀÌ ÇÔ¼öµé¿¡ ´ëÇؼ­´Â API Á¤º¹ 37ÀåÀ» Âü°íÇϱ⠹ٶõ´Ù. ´Ü¼øÈ÷ »ç¿ëÇϱ⸸ ÇÑ´Ù¸é ÀÌ ÇÔ¼öÀÇ ³»¿ëÀº ´çÀå ¸ô¶óµµ »ó°ü¾ø´Ù. ¼³Ä¡ ´ëÈ­»óÀÚÀÇ ÇÁ·Î½ÃÀú´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

BOOL CALLBACK SetupDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     TCHAR szPath[MAX_PATH];

     TCHAR szLink[MAX_PATH];

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          SetDlgItemText(hDlg,IDC_IS_MESSAGE,"´ç±ÙÀº ÅؽºÆ®¸¦ º¸°í ÆíÁýÇÒ ¼ö"

              " ÀÖ´Â ÅؽºÆ® ÆíÁý ÇÁ·Î±×·¥ÀÔ´Ï´Ù.\r\n\r\n"

              "óÀ½ ½ÇÇàÇϼÌÀ¸¹Ç·Î ´ÙÀ½ Ãʱ⠼³Á¤À» ¼±ÅÃÇØ ÁֽʽÿÀ.ÀÌ ´ëÈ­»óÀÚ´Â ÃÖÃÊ "

              "½ÇÇà½Ã ÇÑ ¹ø¸¸ ³ªÅ¸³ª¸ç ÀÌÈĺÎÅÍ µµ±¸ ¸Þ´ºÀÇ ±âº»¼³Á¤ ¸í·ÉÀ¸·Î ¸ðµç ¿É¼ÇÀ»"

              " º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù. ±âº»À¸·Î ÁÖ¾îÁø ¿É¼ÇÀÌ °¡Àå ¹«³­ÇÕ´Ï´Ù.\r\n\r\n"

              "°¨»çÇÕ´Ï´Ù.");

          CheckDlgButton(hDlg,IDC_IS_POPUP,BST_CHECKED);

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))

          {

          case IDOK:

          case IDCANCEL:

              if (IsDlgButtonChecked(hDlg,IDC_IS_POPUP)==BST_CHECKED) {

                   RegisterPopup(TRUE);

              }

 

              if (IsDlgButtonChecked(hDlg,IDC_IS_MAKEICON)==BST_CHECKED) {

                   MyGetSpecialFolderPath(hDlg, CSIDL_DESKTOP, szLink);

                   lstrcat(szLink, "\\´ç±Ù.lnk");

                   GetModuleFileName(g_hInst,szPath,MAX_PATH);

                   MyCreateShortCut(szPath, szLink, "", "´ç±Ù");

              }

 

              if (IsDlgButtonChecked(hDlg,IDC_IS_REGMENU)==BST_CHECKED) {

                   MyGetSpecialFolderPath(hDlg, CSIDL_PROGRAMS, szPath);

                   lstrcat(szPath, "\\´ç±Ù");

                   CreateDirectory(szPath,NULL);

 

                   lstrcpy(szLink, szPath);

                   lstrcat(szLink, "\\´ç±Ù.lnk");

                   GetModuleFileName(g_hInst,szPath,MAX_PATH);

                   MyCreateShortCut(szPath, szLink, "", "´ç±Ù");

              }

              EndDialog(hDlg,0);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

WM_INITDIALOG¿¡¼­ ¾È³» ¸Þ½ÃÁö¸¦ º¸¿©ÁÖ¸ç Ž»ö±â Æ˾÷¸Þ´º ¿É¼ÇÀ» ¹Ì¸® ¼±ÅÃÇسõ¾Æ ±ÇÀå¿É¼ÇÀÓÀ» Ç¥½ÃÇÑ´Ù. IDOK ¹öÆ°À» Ŭ¸¯ÇÏ¸é ¼±ÅÃÇÑ ¿É¼Ç°ªÀ» Àоî ȯ°æÀ» ÃʱâÈ­ÇÑ´Ù. Ž»ö±â Æ˾÷¸Þ´º µî·ÏÀº ¹Ì¸® ¸¸µé¾î µÐ RegisterPopup ÇÔ¼ö¸¦ È£ÃâÇÏ¸ç ³ª¸ÓÁö µÎ ¿É¼ÇÀº Á÷Á¢ Æú´õ¿Í ¼îÆ®ÄÆÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ¼îÆ®ÄÆ »ý¼º°ú Ư¼ö Æú´õ ÀÛ¼º¿¡ ´ëÇؼ­µµ API Á¤º¹ 37ÀåÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.

ÀÌ ´ëÈ­»óÀÚ´Â ÀÏÁ¾ÀÇ ¾È³» ´ëÈ­»óÀÚÀ̱⠶§¹®¿¡ Ãë¼Ò ¹öÆ°Àº ¾øÀ¸¸ç ŸÀÌƲ¹ÙÀÇ ´Ý±â ¹öÆ°À» Ŭ¸¯ÇÏ¿©µµ IDOK¸¦ ´©¸¥ °Í°ú µ¿ÀÏÇÏ°Ô Ãë±ÞÇÑ´Ù. ¼³Ä¡ ´ëÈ­»óÀÚ´Â ¸ÞÀÎ À©µµ¿ì°¡ ¸¸µé¾îÁö±â Àü¿¡ ½ÇÇàµÇ¾î¾ß ÇϹǷΠWinMain¿¡¼­ È£ÃâÇÑ´Ù.

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

            ,LPSTR lpszCmdParam,int nCmdShow)

{

    CoInitialize(NULL);

     hMenu1=LoadMenu(g_hInst,MAKEINTRESOURCE(IDR_MENU1));

     hMenu2=LoadMenu(g_hInst,MAKEINTRESOURCE(IDR_MENU2));

     ....

     RegisterClassEx(&WndClassEx);

 

    if (SHRegReadInt(SHCU,KEY"Setting","StartAction",1000)==1000) {

        DialogBox(g_hInst, MAKEINTRESOURCE(IDD_SETUP), HWND_DESKTOP, SetupDlgProc);

    }

 

     hWnd=CreateWindow(lpszClass,"´ç±Ù",WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,

          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

          NULL,(HMENU)NULL,hInstance,NULL);

     ....

    CoUninitialize();

     return (int)Message.wParam;

}

 

½© ÇÔ¼öµéÀº COM ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϹǷΠCoInitialize·Î ½© ¶óÀ̺귯¸®¸¦ ÃʱâÈ­Çß´Ù. ·¹Áö½ºÆ®¸®¿¡¼­ StartAction °ªÀ» ÀÐ¾î º¸°í ÀÌ °ªÀÌ Á¤ÀǵǾî ÀÖÁö ¾ÊÀ¸¸é óÀ½ ½ÇÇàµÈ °ÍÀ¸·Î °£ÁÖÇÏ°í ¼³Ä¡ ´ëÈ­»óÀÚ¸¦ º¸¿©ÁØ´Ù. µÎ ¹ø°ºÎÅÍ´Â StartAction Å°°¡ Á¸ÀçÇϹǷΠÀÌ ´ëÈ­»óÀÚ°¡ ³ªÅ¸³ªÁö ¾Ê´Â´Ù. ·¹Áö½ºÆ®¸® ÆíÁý±â¿¡¼­ Dangeun ¼­ºêÅ°¸¦ »èÁ¦ÇÑ ÈÄ ½ÇÇàÇÏ¸é ¼³Ä¡ ´ëÈ­»óÀÚ°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.