´ç±ÙÀº ½ÇÇàÆÄÀÏ È¥ÀÚ¼ ½ÇÇàµÇ´Â ´Üµ¶ ½ÇÇàÆÄÀÏÀ̸ç ÀÏüÀÇ ºÎ¼ÓÆÄÀÏÀÌ ¾ø´Ù. ±×·¡¼ °ü¸®Çϱâ´Â Æí¸®ÇÑ ÀÌÁ¡ÀÌ ÀÖÁö¸¸ ´ç±ÙÀÌ ½ÇÇàµÇ±â À§ÇÑ È¯°æÀ» ¸¸µé¾îÁÖ´Â ¼³Ä¡ ÇÁ·Î±×·¥ÀÌ µû·Î ¾ø¾î ½º½º·Î ȯ°æÀ» ¸¸µç ÈÄ ½ÇÇàÇØ¾ß ÇÑ´Ù. ÇöÀç »óȲ¿¡¼ ´ç±ÙÀÇ ½ÇÇà ȯ°æÀ» ÃʱâÈÇÏ´Â ÄÚµå´Â 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 ¼ºêÅ°¸¦ »èÁ¦ÇÑ ÈÄ ½ÇÇàÇÏ¸é ¼³Ä¡ ´ëÈ»óÀÚ°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.