성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <br /> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>IE 8: 프로세스와 윈도우의 관계 - LCIE</div><br /> <br /> 우선, 이것을 알아보기에 앞서 재미있는 프로그램을 하나 만들어 보겠습니다. Visual Studio 2008에서 "새 프로젝트" 만들기 기능을 이용해서 "Win32 Project"를 2개 만듭니다. 하나의 이름은 "UIFrame"이라고 하고, 다른 하나는 "ChildFrame"이라고 이름 짓겠습니다.<br /> <br /> 그다음, "UIFrame"의 "WM_CREATE" 윈도우 메시지에 다음과 같은 코드를 넣어둡니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > switch (message) { case WM_CREATE: { wchar_t buffer[ MAX_PATH ]; PROCESS_INFORMATION processInfo; STARTUPINFO startupInfo; memset((PVOID)&startupInfo, 0, sizeof(STARTUPINFO)); startupInfo.cb = sizeof(STARTUPINFO); <b style='color: Blue;'>wsprintf(buffer, L"ChildFrame.exe %d", hWnd);</b> ::<b style='color: Blue;'>CreateProcess</b>(NULL, buffer, NULL, NULL, TRUE, 0, NULL, L".", &startupInfo, &processInfo); } </pre> <br /> 보는 바 그대로, UIFrame EXE 프로세스에서 ChildFrame.exe 프로세스로 자신의 윈도우 핸들 값을 넘기고 있습니다.<br /> <br /> 그다음, "ChildFrame"의 _tWinMain 도입부에서는 넘겨받은 인자를 HWND 타입으로 저장해 놓습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > HWND g_parentWindow; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { <b style='color: Blue;'>g_parentWindow = (HWND)_wtoi(lpCmdLine);</b> </pre> <br /> 마지막으로 InitInstance 메서드에서 부모 윈도우를 지정해서 ChildFrame 윈도우를 생성합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable DWORD exStyle = 0; hWnd = CreateWindowEx(exStyle, szWindowClass, szTitle, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME, 50, 50, 300, 200, <b style='color: Blue;'>g_parentWindow</b>, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } </pre> <br /> 자, 이제 끝입니다. ^^ 각각의 WM_PAINT 메서지 안에서 자신의 Process ID를 출력하도록 만들고 실행시키면 다음과 같은 화면으로 실행이 됩니다. <br /> <br /> [그림 1: 서로 다른 EXE 프로세스에서 하나의 윈도우 공유]<br /> <img alt='loosely_coupled_architecture_1.png' src='/SysWebRes/bbs/loosely_coupled_architecture_1.png' /><br /> <br /> 테스트 삼아서, ChildFrame.exe를 작업관리자를 통해서 강제 종료해봅니다. 그럼 내부에 있는 "4344" 윈도우만 사라지고 UIFrame.exe는 계속 정상적인 동작을 합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> "정확히" 그렇다고는 말할 수 없지만 (왜냐하면 IE8을 제가 만든 것이 아니므로.), 일단 제가 테스트 해본 바에 의하면 위와 같은 구현 방식이 IE 8에 적용되어 있습니다. IE 8의 공개된 문서에 의하면 이것을 "Loosely-coupled Internet Explorer(LCIE)"라는 아키텍처로 설명하고 있습니다.<br /> <br /> IE 8에 특화된 좀 더 자세한 이야기는 요즘 만들고 있는 "개발자를 위한 IE 8"이라는 이름으로 나름 정리하고 있는 문서에서 다룰 테니... ^^ 조금만 기다려주십시오.<br /> <br /> <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=443&boardid=331301885'>첨부된 파일</a>은 위의 소스코드를 테스트한 간단한 프로젝트입니다.<br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
2890
(왼쪽의 숫자를 입력해야 합니다.)