³»°¡ ¸¸µå´Â ÇÁ·Î±×·¥À» Ç×»ó Çϳª¸¸ ½ÇÇàÇϵµ·Ï ÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß Çϳª ? ±×¸®°í µÎ ¹øÂ° ½ÇÇà½Ã¿¡´Â ¸ÕÀú ½ÇÇàµÇ¾î ÀÖ´ø ÇÁ·Î±×·¥À» ¾ÕÀ¸·Î ¶ç¿ì°í ½Í´Ù.
¸¸ÀÏ ÇÁ·Î±×·¥ÀÇ Ä¸¼ÇÀÌ °íÁ¤µÇ¾î Àִٵ簡 »ç¿ëµÇ´Â À©µµ¿ìÀÇ Å¬·¡½º À̸§À» ¾Ë°í ÀÖ´Ù¸é FindWindow ȤÀº FindWindowEx¸¦ »ç¿ëÇÏ¸é ¾ÆÁÖ ¼Õ½±°Ô ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ À©µµ¿ìÀÇ Ä¸¼ÇÀÌ °è¼ÓÀûÀ¸·Î º¯ÇÑ´ÙµçÁö À©µµ¿ì Ŭ·¡½º À̸§À» ¸ð¸£´Â °æ¿ì¿¡´Â À̰ÍÀ¸·Î ÇØ°áÃ¥ÀÌ µÇÁö ¸øÇÑ´Ù. MFC¸¦ »ç¿ëÇÒ °æ¿ì°¡ ´ëÇ¥ÀûÀε¥ À©µµ¿ì Ŭ·¡½ºÀÇ À̸§À» MFC ³»ºÎ¿¡¼ ¸¸µé¾î »ç¿ëÇϱ⠶§¹®¿¡ À©µµ¿ì Ŭ·¡½º¸¦ Á÷Á¢ µî·ÏÇÏ¿© »ç¿ëÇÏ´Â °í³µµÀÇ ±â¼úÀ» »ç¿ëÇϱâ ÀÌÀü¿¡´Â À©µµ¿ì Ŭ·¡½ºÀÇ À̸§À» ¾Ë ¼ö°¡ ¾ø´Ù. ÇØ°áÃ¥¿¡´Â ¿©·¯ °¡Áö ¹æ¹ýÀÌ ÀÖ°ÚÁö¸¸ ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ ÀÌ¿ëÇϵµ·Ï ÇϰڴÙ. ¿ø·¡ ÆÄÀÏ ¸ÊÇÎ °´Ã¼ÀÇ ¸ñÀûÀº ¿©·¯ ÇÁ·Î¼¼½º°£¿¡ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ±â À§ÇØ »ç¿ëµÇ¸ç »ç¿ë ¹æ½Ä ÀÚü´Â ±âÁ¸ÀÇ µ¿Àû ¸Þ¸ð¸® ÇÒ´ç ¹æ½Ä°ú Èí»çÇÏ´Ù.
°£´ÜÈ÷ ÀýÂ÷¸¦ ¼³¸íÇÏ¸é ´ÙÀ½°ú °°´Ù. óÀ½ ¶ß´Â ÇÁ·Î±×·¥ÀÌ Á¤ÇØÁø À̸§ÀÇ ÆÄÀÏ ¸ÊÇÎ °´Ã¼(¿©±â¼´Â À̸§Àº My TestMap)¸¦ ¸¸µé¾î ³õ´Â´Ù. ±×¸®°í ³ª¼ ÀÚ½ÅÀÇ ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµéÀ» ±× °´Ã¼¿¡ ±â·ÏÇØ ³õ´Â´Ù. ÀÌ ¶§ ´Ù½Ã ±× ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é ÀÌ À̸§ÀÇ ÆÄÀÏ ¸ÊÇÎ °´Ã¼°¡ ÀÖ´ÂÁö »ìÆìº¸°í ÀÖÀ¸¸é ½ÇÇàÀ» ÁßÁöÇÑ´Ù. ±×¸®°í ÆÄÀÏ ¸ÊÇÎ °´Ã¼¿¡ ±â·ÏµÇ¾î ÀÖ´Â À©µµ¿ìÀÇ Çڵ鰪À» ÀÐ¾î¼ ¾ÕÀ¸·Î ¶ç¿ö ¹ö¸°´Ù. À̰ÍÀÌ °¡´ÉÇÑ ÀÌÀ¯´Â ÆÄÀÏ ¸ÊÇÎ °´Ã¼´Â ½Ã½ºÅÛ Àü¿ª °´Ã¼À̱⠶§¹®ÀÌ´Ù. Áï ÇÑ ÇÁ·Î¼¼½º¿¡¼ ¸¸µé¾îµµ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ¸ÕÀú Ç×»ó Çϳª¸¸ ¶° ÀÖ°Ô ÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸°í ´ÙÀ½À¸·Î ±âÁ¸ÀÇ ÇÁ·Î±×·¥À» ¾ÕÀ¸·Î ¶ç¿ì´Â Äڵ带 ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. »ç½Ç ¾Æ·¡ÀÇ Äڵ带 ÀÌÇØÇÏ·Á¸é ÆÄÀÏ ¸ÊÇÎ °´Ã¼¿¡ ´ëÇØ ¾Ë¾Æ¾ß Çϴµ¥ ±×°Í ÀÚü¿¡ ´ëÇÑ ¼³¸íÀº »ý·«Çϱâ·Î ÇϰڴÙ.
Ç×»ó Çϳª¸¸ ¶° ÀÖ°Ô ÇÏ´Â ¹æ¹ý
´ÙÀ½ Äڵ带 ¾ÖÇø®ÄÉÀÌ¼Ç Å¬·¡½ºÀÇ InitInstanceÀÇ ¼±µÎ¿¡ ³Ö´Â´Ù. ÆÄÀÏ ¸ÊÇÎ °´Ã¼ÀÇ Å©±â¸¦ 4¹ÙÀÌÆ®·Î ÀâÀº ÀÌÀ¯´Â À©µµ¿ì ÇÚµéÀÌ UINTÀÌ°í ±× Å©±â°¡ 4¹ÙÀÌÆ®À̱⠶§¹®ÀÌ´Ù. CreateFileMapping API´Â ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ »ý¼ºÇÒ ¶§ »ç¿ëµÇ´Âµ¥, À̸§°ú Å©±â¸¦ ÁÙ ¼ö ÀÖ´Ù. ÀÌ¹Ì Á¸ÀçÇÏ´Â À̸§À¸·Î ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ »ý¼ºÇÏ·Á°í Çϸé GetLast Error¶ó´Â API¸¦ È£ÃâÇßÀ» ¶§ ERROR_ALREADY_ EXISTS¶ó´Â ¿¡·¯ Äڵ尡 ¸®ÅϵȴÙ. À̰ÍÀ¸·Î ¸ÕÀú ½ÇÇàµÈ ÇÁ·Î±×·¥ÀÌ ÀÖ´ÂÁö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.
HANDLE hMapping;
// MyTestMapÀ̶õ À̸§À¸·Î 4¹ÙÀÌÆ®ÀÇ ¿µ¿ªÀ» Àâ´Â´Ù
hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 4, ¡°MyTestMap¡± );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// °°Àº À̸§ÀÇ ÆÄÀÏ ¸ÊÇÎ °´Ã¼°¡ Á¸Àç
{
// ÇÁ·Î±×·¥ÀÌ ÀÌ¹Ì ½ÇÇàÁßÀÓÀ» ¾Ë¸®´Â ¸Þ½ÃÁö¸¦ ¶ç¿î´Ù.
MessageBox( NULL, ¡°ÀÌ¹Ì ½ÇÇà ÁßÀÔ´Ï´Ù.¡±, ¡°°æ°í¡±, MB_OK );
return FALSE;
}
}
À§ÀÇ ÄÚµå´Â ÇϳªÀÇ ½ÇÇàÆÄÀÏÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌÁö¸¸ ±âÁ¸¿¡ ½ÇÇàµÇ¾î ÀÖ´Â ÇÁ·Î±×·¥À» ¾ÕÀ¸·Î ¶ç¿ì´Â ÀϱîÁö ÇÒ ¼ö´Â ¾ø´Ù. ±×·¸°Ô ÇÏ°í ½Í´Ù¸é InitInstanceÀÇ ÄÚµåÀÇ ³¡ ºÎºÐ¿¡ ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµéÀ» ÆÄÀÏ ¸ÊÇÎ °´Ã¼¿¡ ÀúÀåÇÏ´Â Äڵ带 Ãß°¡ÇÑ´Ù. ¾Æ·¡ÀÇ ¿¹´Â SDI(Single Document Interface) ȤÀº MDI(Multiple Document Interface)Çü½ÄÀÇ ÇÁ·ÎÁ§Æ®ÀÎ °æ¿ìÀÇ ¿¹ÀÌ´Ù. ¸¸ÀÏ ´ÙÀ̾ó·Î±× ±â¹ÝÀÇ ÇÁ·ÎÁ§Æ®¶ó¸é ¾Æ·¡ÀÇ ÄÚµå´Â ¸ÞÀÎ ´ÙÀ̾ó·Î±× Ŭ·¡½ºÀÇ WM_CREATE ¸Þ½ÃÁö³ª OnInitDialog ÇÔ¼ö¿¡ Ãß°¡µÇ¾î¾ß ÇÑ´Ù. CreateFileMappingÀ¸·Î »ý¼ºµÈ ÆÄÀÏ ¸ÊÇÎ °´Ã¼´Â MapViewOfFileÀ̶õ API¸¦ ÅëÇØ ¸Þ¸ð¸® Æ÷ÀÎÅÍ·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. Áï ÇÒ´çµÈ ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® Æ÷ÀÎÅ͸¦ »ç¿ëÇØ ³»¿ëÀ» ÀÐ°í ¾²°í ÇÒ ¼ö ÀÖ´Ù.
LPDWORD lpDword;
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// ---------------------------------
// À̹ø¿¡´Â ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ ¾²±â ¸ðµå·Î ¿ÀÇÂÇÑ´Ù.
lpDword=(LPDWORD)MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 4);
// ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµéÀ» ÀúÀåÇÑ´Ù.
*lpDword = (DWORD)m_pMainWnd->m_hWnd;
UnmapViewOfFile(lpDword);
// ---------------------------------
m_pMainWnd->ShowWindow(SW_SHOW);
±×·¯¸é ¾Õ¼ »ìÆìº¸¾Ò´ø µÎ ¹øÂ°·Î ¶ß´Â ÇÁ·Î±×·¥ÀÎÁö üũÇÏ´Â ÄÚµå ºÎºÐÀ» º¸°ÇØ º¸ÀÚ. µÎ ¹øÂ° ¶ß´Â ÇÁ·Î±×·¥ÀÏ °æ¿ì¿¡ ¿ø·¡ ¸ÕÀú ¶¹´ø ÇÁ·Î±×·¥ÀÇ ¸ÞÀÎ À©µµ¿ì¸¦ ¾ÕÀ¸·Î ³»¼¼¿ì´Â Äڵ带 Ãß°¡ÇØ º¸ÀÚ.
hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 32, ¡°MyTestMap¡± );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// °°Àº À̸§ÀÇ ÆÄÀÏ ¸ÊÇÎ °´Ã¼°¡ Á¸Àç
{
// ÇÁ·Î±×·¥ÀÌ ÀÌ¹Ì ½ÇÇà ÁßÀÓÀ» ¾Ë¸®´Â ¸Þ½ÃÁö¸¦ ¶ç¿î´Ù.
MessageBox( NULL, ¡°ÀÌ¹Ì ½ÇÇà ÁßÀÔ´Ï´Ù.¡±, ¡°°æ°í¡±, MB_OK );
// ±âÁ¸ ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ ¿¬´Ù. ±âÁ¸ ÆÄÀÏ ¸ÊÇÎ °´Ã¼ÀÇ ¼±µÎ¿¡ ÀÌÀü ÇÁ·Î±×·¥
// ÀÇ ¸ÞÀÎ À©µµ¿ì ÇÚµéÀÌ µé¾îÀÖ´Ù. µÞºÎºÐÀÇ Äڵ带 º¸¸é ¾Ë °ÍÀÌ´Ù.
LPDWORD lpDword;
HWND hWnd;
// ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ Àб⠸ðµå·Î ¿ÀÇÂÇÑ´Ù.
hMapping = OpenFileMapping(FILE_MAP_READ, FALSE,
¡°MyTestMap¡±);
// ÆÄÀÏ ¸ÊÇÎ °´Ã¼ ÇÚµé·ÎºÎÅÍ Æ÷ÀÎÅ͸¦ ¾ò¾î³½´Ù.
lpDword = (LPDWORD)MapViewOfFile(hMapping,
FILE_MAP_READ, 0, 0, 4);
// ÀúÀåµÇ¾î ÀÖ´ø À©µµ¿ì ÇÚµéÀ» ¾ò¾î³½´Ù.
hWnd = (HWND)*lpDword;
// À©µµ¿ì¸¦ Àü¸éÀ¸·Î ³»¼¼¿ì±â Àü¿¡ ¸ÕÀú ¾ÆÀÌÄÜ »óÅ¿¡ ÀÖÀ»Áöµµ ¸ð¸£´Â
// À©µµ¿ì¸¦ ¿ø·¡ Å©±â·Î µÇµ¹¸°´Ù. IsIconic ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¾ÆÀÌÄÜ »óÅÂ
// ¿©ºÎ¸¦ È®ÀÎÇØµµ µÉ °ÍÀÌ´Ù.
ShowWindow(hWnd, SW_SHOW);
// À©µµ¿ì¸¦ Àü¸éÀ¸·Î ³»¼¼¿î´Ù.
SetForegroundWindow(hWnd);
// ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ ´Ý´Â´Ù.
UnmapViewOfFile(lpDword);
return FALSE;
}
À§ÀÇ Äڵ忡¼ À©µµ¿ì¸¦ Àü¸éÀ¸·Î ³»¼¼¿ì´Âµ¥ SetFore groundWindow¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù´Â °ÍÀ» ±â¾ïÇØ µÎ±â ¹Ù¶õ´Ù. ÀÌ ÇÔ¼öÀÇ ÀÎÀڷδ ¹Ýµå½Ã ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµéÀ» ÁöÁ¤ÇØ¾ß ÇÑ´Ù. Áö±Ý±îÁö »ìÆìº¸¾Ò´ø Äڵ带 ´Ù½Ã ÀüüÀûÀ¸·Î Á¤¸®ÇÏ¸é ´ÙÀ½°ú °°´Ù.
HANDLE hMapping;
hMapping = CreateFileMapping( (HANDLE) 0xffffffff, NULL,
PAGE_READWRITE, 0, 32, ¡°MyTestMap¡± );
if (hMapping)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
// °°Àº À̸§ÀÇ ÆÄÀÏ ¸ÊÇÎ °´Ã¼°¡ Á¸Àç
{
// ÇÁ·Î±×·¥ÀÌ ÀÌ¹Ì ½ÇÇà ÁßÀÓÀ» ¾Ë¸®´Â ¸Þ½ÃÁö¸¦ ¶ç¿î´Ù.
MessageBox( NULL, ¡°ÀÌ¹Ì ½ÇÇà ÁßÀÔ´Ï´Ù.¡±, ¡°°æ°í¡±, MB_OK );
// ±âÁ¸ ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ ¿¬´Ù. ±âÁ¸ ÆÄÀÏ ¸ÊÇÎ °´Ã¼ÀÇ ¼±µÎ¿¡ ÀÌÀü ÇÁ·Î±×·¥ÀÇ
// ¸ÞÀÎ À©µµ¿ì ÇÚµéÀÌ µé¾îÀÖ´Ù. µÞºÎºÐÀÇ Äڵ带 º¸¸é ¾Ë °ÍÀÌ´Ù.
LPDWORD lpDword;
HWND hWnd;
// ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ Àб⠸ðµå·Î ¿ÀÇÂÇÑ´Ù.
hMapping = OpenFileMapping(FILE_MAP_READ, FALSE,
¡°MyTestMap¡±);
// ÆÄÀÏ ¸ÊÇÎ °´Ã¼ ÇÚµé·ÎºÎÅÍ Æ÷ÀÎÅ͸¦ ¾ò¾î³½´Ù.
lpDword = (LPDWORD)MapViewOfFile(hMapping,
FILE_MAP_READ, 0, 0, 4);
// ÀúÀåµÇ¾î ÀÖ´ø À©µµ¿ì ÇÚµéÀ» ¾ò¾î³½´Ù.
hWnd = (HWND)*lpDword;
// À©µµ¿ì¸¦ Àü¸éÀ¸·Î ³»¼¼¿ì±â Àü¿¡ ¸ÕÀú ¾ÆÀÌÄÜ »óÅ¿¡ ÀÖÀ»Áöµµ ¸ð¸£´Â
// À©µµ¿ì¸¦ ¿ø·¡ Å©±â·Î µÇµ¹¸°´Ù. IsIconic ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¾ÆÀÌÄÜ
// »óÅ ¿©ºÎ¸¦ È®ÀÎÇØµµ µÉ °ÍÀÌ´Ù.
ShowWindow(hWnd, SW_SHOW);
// À©µµ¿ì¸¦ Àü¸éÀ¸·Î ³»¼¼¿î´Ù.
SetForegroundWindow(hWnd);
// ÆÄÀÏ ¸ÊÇÎ °´Ã¼¸¦ ´Ý´Â´Ù.
UnmapViewOfFile(lpDword);
return FALSE;
}
// ÀÌ µÚºÎÅÍ ------ ±îÁö´Â ¿ø·¡ InitInstance ÄÚµå
.....
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// --------------
// ´ÙÀ½À» Ãß°¡ÇÑ´Ù.
LPDWORD lpDword;
lpDword = (LPDWORD)MapViewOfFile(hMapping, FILE_MAP_WRITE,
0, 0, 4);
*lpDword = (DWORD)m_pMainWnd->m_hWnd;
UnmapViewOfFile(lpDword);
// ÀÌ µÚ·Î´Â ´Ù½Ã ¿ø·¡ InitInstanceÀÇ ÄÚµå
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
Ãâó : www.codeland.co.kr
|
|
|