IPC (Inter Process Communication)
»ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö³ª ½Ã½ºÅÛ Á¤ÀÇ ¸Þ½ÃÁö¸¦ ÀÌ¿ëÇؼ »ó´ë¹æ¿¡°Ô Àü´ÞÇÒ ¼ö ÀÖ´Â ÀÖ´Â ºÎ°¡ÀûÀÎ Á¤º¸(WPARAM, LPARAM)´Â °£´ÜÇÑ Á¤¼ö°ªÀ̳ª À©µµ¿ì Çڵ鰪 Á¤µµÀÌ°í, ¹®ÀÚ¿À» º¸³»±â´Â ¾î·Æ´Ù. À̶§ À©µµ¿ì 95¿¡ »õ·Ó°Ô Ãß°¡µÈ ¸Þ½ÃÁö WM_COPYDATA¸¦ »ç¿ëÇÏ¸é ½±°Ô ÇØ°áÇÒ ¼ö ÀÖ´Ù.
2. WM_COPYDATA ÀÌ¿ë
WM_COPYDATA´Â À©µµ¿ìÁî ½Ã½ºÅÛ¿¡¼ »ç¿ëÇÏ´Â ¸Þ½ÃÁöÀ̹ǷÎ, ¿ì¸®°¡ ´Ù½Ã Á¤ÀÇÇÒ ÇÊ¿ä´Â ¾ø´Ù. COPYDATASTRUCT ±¸Á¶Ã¼´Â WM_COPYDATA ¸Þ½ÃÁö¿Í ÇÔ²² Àü´ÞµÉ ºÎ°¡ÀûÀÎ Á¤º¸ÀÌ´Ù. WM_COPYDATA ¸Þ½ÃÁö´Â ÇÑ ÇÁ·Î±×·¥¿¡¼ ´Ù¸¥ ¸ñÀûÀ¸·Î ¿©·¯ ¹ø »ç¿ëµÉ ¼ö ÀÖ´Ù. WM_COPYDATA ¸Þ½ÃÁö¸¦ ¿©·¯ ¹ø »ç¿ëÇÏ´õ¶óµµ ±× ¸ñÀû¿¡ µû¶ó ±¸ºÐÇÒ ¼ö ÀÖ´Â ±âÁØÀÌ ÇÊ¿äÇѵ¥, ÀÌ ¿ªÇÒÀ» COPYDATASTRUCT ±¸Á¶Ã¼ÀÇ ¸â¹öº¯¼ö dwData°¡ ÇÑ´Ù.
À̹ø ¿¹Á¦´Â IPC4, IPC5ÀÇ µÎ ÇÁ·ÎÁ§Æ®ÀÌ°í ÇϳªÀÇ ÇÁ·ÎÁ§Æ®¿¡ µÎ °³¸¦ ÇÕÄ£ ÇüÅÂÀÌ´Ù.
1) ¼Û½Å ÇÁ·Î±×·¥À» ¸¸µé¾îº¸ÀÚ. IPC4 ¶ó´Â À̸§À¸·Î ´ÙÀ̾ó·Î±× º£À̽ºÀÇ ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µç´Ù.
2) ´ÙÀ½°ú °°ÀÌ ´ÙÀ̾ó·Î±× ƲÀ» ¸¸µç´Ù. À§ÂÊ¿¡ ¿¡µðÆ® ¹Ú½º, ¾Æ·¡¿¡ ¹öÆ° 2°³¸¦ ³õ´Â´Ù. °¢ ÄÁÆ®·ÑÀÇ ID´Â IDC_EDIT_DATA, IDC_BUTTON_SEND ÀÌ´Ù. "Á¾·á" ¹öÆ°Àº óÀ½ ´ÙÀ̾ó·Î±× ÅÛÇø´À» ¸¸µé¸é ÀÖ´Â "È®ÀÎ" ¹öÆ°(IDOK)¿¡¼ ĸ¼Ç¸¸ ¹Ù²Û °ÍÀÌ°í, "Ãë¼Ò" ¹öÆ°Àº »èÁ¦Çß´Ù.
3) ´ÙÀ½Àº "º¸³»±â" ¹öÆ°¿¡ ´ëÇÑ Çڵ鷯ÀÌ´Ù. ´ÙÀ½ Äڵ忡¼
cds.lpData = (LPSTR)(LPCSTR)strData;
ÀÌ ºÎºÐÀ» Àß »ìÆ캸ÀÚ. ÀÌ°ÍÀº ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ ¹®ÀÚ¿À» char* ÇüÀ¸·Î Çüº¯È¯ÇÏ´Â °úÁ¤ÀÌ´Ù. CString ŸÀÔÀ» char* ·Î Á÷Á¢ º¯È¯½Ãų ¼ö ¾ø±â ¶§¹®¿¡ CStringÀÇ ¸â¹öÇÔ¼ö operator LPCTSTRÀ» Áß°£¿¡ »ç¿ëÇÑ´Ù.
void CIPC4Dlg::OnButtonSend()
{
//
TODO: Add your control notification handler code here
CString
strData;
// ¿¡µðÆ®
¹Ú½ºÀÇ ¹®ÀÚ¿À» ¾òÀ½
GetDlgItemText(IDC_EDIT_DATA,
strData);
COPYDATASTRUCT
cds;
cds.dwData = 1004;
// »ç¿ë¸ñÀû¿¡ µû¸¥ ½Äº°°ª
cds.cbData
= strData.GetLength()+1; // Àü´ÞµÉ Á¤º¸ lpDataÀÇ
Å©±â
cds.lpData = (LPSTR)(LPCSTR)strData;
// Àü´ÞµÉ Á¤º¸
CWnd
*pWnd = CWnd::FindWindow(NULL, "¹Þ±â ÇÁ·Î±×·¥");
if(!pWnd)
{
AfxMessageBox("Program
is not found!");
return;
}
pWnd->SendMessage(WM_COPYDATA,
(WPARAM)m_hWnd, (LPARAM)&cds);
}
4) ÀÌÁ¦ ¼ö½Å ÇÁ·Î±×·¥À» ¸¸µé¾îº¸ÀÚ. ÇÁ·ÎÁ§Æ®¸íÀº IPC5ÀÌ°í, ¿ª½Ã ´ÙÀ̾ó·Î±× º£À̽º·Î ¸¸µç´Ù.
5) ´ÙÀ̾ó·Î±× ÅÛÇø´Àº ´ÙÀ½°ú °°´Ù. ¿¡µðÆ® ¹Ú½º Çϳª¿¡ ¹öÆ° Çϳª. ¿¡µðÆ® ¹Ú½ºÀÇ ID´Â IDC_EDIT_DATA ÀÌ°í, È®ÀÎ ¹öÆ°Àº ±×´ë·ÎÀÌ´Ù. ±×¸®°í ¹Ýµå½Ã ´ÙÀ̾ó·Î±×ÀÇ Ä¸¼ÇÀº "¹Þ±â ÇÁ·Î±×·¥" À¸·Î ÇÑ´Ù. FindWindow() ÇÔ¼ö¿¡¼ »ç¿ëÇϱâ À§ÇؼÀÌ´Ù.
6) Ŭ·¡½º À§Àúµå¿¡¼ WM_COPYDATA ¸Þ½ÃÁö¸¦ ¼±ÅÃÇؼ ´ÙÀ½°ú °°ÀÌ Çڵ鷯¸¦ ÀÛ¼ºÇÑ´Ù.
BOOL CIPC5Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your
message handler code here and/or call default
switch(pCopyDataStruct->dwData)
{
case 1004 :
SetDlgItemText(IDC_EDIT_DATA,
(LPCSTR)pCopyDataStruct->lpData);
break;
}
return
CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
- the end of this article -