수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1692321
  • Today | 465
  • Yesterday | 564

2 Articles, Search for 'ATOM'

  1. 2007/05/15 IPC (Inter Process Communication)
  2. 2007/02/21 ATOM을 이용한 프로세스간 데이터 공유
Programming/MFC2007/05/15 10:03

IPC (Inter Process Communication)

Feb 04 2003 14:11 Written by myku.hihome.com


사용자의 요구가 증대되면서 프로그램이 갖춰야 할 기능 또한 많아지고
당연히 프로그램 크기도 비대해졌다.
또한 하나의 프로그램만으로는 사용자의 욕구를 충족시키지 못해
여러개의 프로그램을 만들어야 하는 상황이 발생하고 있다.
여기서 서로 다른 프로그램 (엄밀히 얘기하면 프로세스)들간에
데이터를 교환하거나 특정 기능을 사용하려면 어떻게 해야 할까?
이런 문제를 해결하기 위한 것이 다음에 소개되는 IPC 기술(프로세스간 통신방법) 이다.


SendMessage() / PostMessage() : 사용자 정의 메시지, 시스템 등록 메시지

WM_COPYDATA, Atom 등을 이용하는 방법
DLL (Dynamic Link Library) 공유
동적 자료 교환 (Dynamic Data Exchange : DDE)
OLE 자동화 (Automation)
메모리 맵 파일 (Memory Map File)
NetBIOS
네임드 파이프 (Named Pipe)
메일 슬롯 (Mail Slot)


위에 나열된 IPC에는 동일 시스템(로컬 시스템)에서만 사용되는 것이 있고,
다른 시스템(리모트 시스템)에서도 작동되는 것이 있다.

다음의 예제는 wParam과 lParam 두 변수를 이용해서 데이터 전송이 가능하다.
이 두 변수의 크기는 다음과 같다.

WPARAM == unsigned int (UINT)

: 윈도우 3.0 / 3.1 같은 16비트 윈도우에서는 16비트(2바이트)이고,
Win32 (32비트 윈도우)에서는 32비트(4바이트)의 값을 가진다.

LPARAM == long

: 16비트나 32비트 모두 32비트(4바이트)의 값을 가진다.



만약 데이터가 4바이트가 넘을 경우, 같은 프로세스 내에서는 구조체에 정보를 담거나
메모리를 할당해서 정보를 저장한 후 이것의 포인터를 lParam을 통해 전달하면 된다.
하지만 다른 프로세스 간에는 이런식은 불가능하고 메모리 맵을 사용해야 한다.


1. SendMessage() / PostMessage() 사용

a) RegisterWindowMessage()를 사용할 경우

RegisterWindowMessage() 함수는 시스템에 유일한 새 윈도우 메시지를 정의하고 등록한다.
리턴되는 메시지 값은 SendMessage() 나 PostMessage() 같은 함수를 호출할 때 사용할 수 있다.



이 함수의 원형은 위와 같다.
이 함수의 인자로는 메시지를 주고받을 프로그램끼리 미리 약속한 문자열을 넘겨준다.
같은 문자열을 이용하여 메시지를 등록한 프로그램끼리만
서로 메시지를 주고받을 수 있게 되는데,
이 함수의 반환값을 다른 프로그램에 전달할 메시지로 이용하면 된다.




/////////////////////////////////////////////////////////////////////
//
// 이제 첫 번째 예제를 만들어보자.
//
/////////////////////////////////////////////////////////////////////



1) 간단하게 테스트하기 위해 다이얼로그 베이스(Dialog based)로
프로젝트를 하나 만든다. 프로젝트명은 IPC1 이다.

2) 리턴되는 메시지 값을 저장하기 위한 변수(nRegMsg)를
IPC1Dlg.cpp 파일에 다음처럼 전역으로 지정한다.



위의 예처럼 cpp파일의 class 정의부 위에 변수를 정의한다면 무난하겠다.

3) 초기화 함수인 OnInitDialog() 함수에서 메시지를 등록한다.
만약 SDI 형식이라면 OnInitialUpdate() 함수에서 이 작업을 하면 되겠다.



4) 다음과 같이 다이얼로그 템플릿을 만든다.
"취소" 버튼은 지우고, "확인" 버튼은 캡션만 "종료" 라고 고친다.
여기서 왼쪽과 오른쪽의 에디트박스의 ID는 각각 IDC_EDIT_WPARAM, IDC_EDIT_LPARAM 이고
"전송" 이라 쓰인 버튼의 ID는 IDC_SEND 이다.


5) 클래스 위저드를 열어서 두 번째 탭 Member Variables를 선택하고,
두 개의 에디트 박스와 연결되는 변수를 다음과 같이 지정한다.

Control IDs:
IDC_EDIT_LPARAM
IDC_EDIT_WPARAM

Type:
long
UINT

Member:
m_lParam
m_wParam


6) 다음은 IDC_SEND 버튼에 대한 핸들러이다.
여기서 사용되는 SendMessage()의 첫 번째 인자는 반드시 HWND_BROADCST 이어야 한다.

SendMessage()의 첫번째 인자가 HWND_BROADCST인 경우 메시지는
시스템상의 모든 top-level 윈도우에 전달된다.
여기에는 disabled 또는 invisible 되어 있거나,
중첩되어 있거나(overlapped), pop-up 윈도우도 포함된다.
하지만 차일드 윈도우에는 메시지가 전달되지 않는다.

여기까지가 송신 프로그램에 대한 내용이다.





7) 여기서부터는 수신 프로그램에 관한 내용이다.

다음과 같이 IPC1Dlg.cpp 파일의 메시지맵 부분에 다음처럼
ON_REGISTERED_MESSAGE 매크로를 이용하여 등록한 메시지와 핸들러를 연결시킨다.




8) 다음은 메시지맵에 추가한 메시지에 연결되는 핸들러를 실제로 작성한다.



9) 이렇듯 하나의 프로그램에 송수신 부분을 다 넣을 수도 있지만,
두 개의 프로그램을 따로 만들 수도 있다.
따로 만든다면 송신 프로그램은 1~6번까지를 적용하면 되고,
수신 프로그램은 2, 3, 7, 8번을 적용하면 된다.


b) FindWindow()를 사용할 경우

FindWindow()의 함수 원형은 다음과 같다.


FindWindow() 함수는 인자로 클래스 이름과 윈도우 캡션을 주고,
그에 해당하는 윈도우를 찾는다. 모든 top-level의 윈도우를 찾지만,
차일드 윈도우는 찾지 못한다. 해당하는 윈도우가 없으면 NULL값이 리턴된다.
만약 lpszClassName이 NULL이면 윈도우 캡션에 해당하는 윈도우만 찾고,
lpszWindowName이 NULL이면 주어진 클래스 이름에 해당하는 윈도우를 찾는다.


///////////////////////////////////////////////////////////////
//
// 여기서 두 번째 예제를 만들어보자.
//
///////////////////////////////////////////////////////////////


1) 먼저 송신 프로그램을 만들어보자.
여기서는 송수신 프로그램을 별도로 만든다.
다이얼로그 베이스의 프로젝트를 하나 만든다.
프로젝트명은 IPC2이다.


2) 다음과 같이 다이얼로그 템플릿을 만든다.
"취소" 버튼은 지우고, "확인" 버튼은 캡션만 "종료" 라고 고친다.
여기서 왼쪽과 오른쪽의 에디트박스의 ID는 각각
IDC_EDIT_WPARAM, IDC_EDIT_LPARAM 이고 "전송" 이라 쓰인 버튼의 ID는 IDC_SEND 이다.

이것은 위 첫 번째 예제의 4번과 동일하다.
송신 프로그램에서 캡션은 상관없다.


3) 클래스 위저드를 열어서 두 번째 탭 Member Variables를 선택하고,
두 개의 에디트 박스와 연결되는 변수를 다음과 같이 지정한다.

이것 또한 위 첫 번째 예제의 5번과 동일하다.

Control IDs:
IDC_EDIT_LPARAM
IDC_EDIT_WPARAM

Type:
long
UINT

Member:
m_lParam
m_wParam


4) IPC2Dlg.cpp 파일의 상단에 다음과 같이 사용자 정의 메시지를 정의한다.



WM_USER 다음에 더하는 숫자는 송수신 프로그램에서 모두 같이 맞추어주기만 하면
지정된 범위내의 아무런 숫자라도 상관없다.



5) 다음으로 "전송" 버튼에 대한 핸들러를 작성한다.
여기까지가 송신 프로그램에 대한 설명이다.




6) 이제 수신 프로그램을 만들어보자.

역시 간단히 구현하기 위해 프로젝트 명이 IPC3인 다이얼로그 베이스 프로젝트를 만든다.



7) IPC3Dlg.cpp 파일의 상단에 다음과 같이 사용자 정의 메시지를 정의한다.



송수신 프로그램에서 반드시 같은 메시지를 사용해야 한다.



8) 다이얼로그 템플릿을 다음과 같이 만든다.
에디트 박스의 ID는 왼쪽에서부터 IDC_EDIT_WPARAM, IDC_EDIT_LPARAM 로 한다.
그리고 반드시 아래 그림과 같이 캡션을 IPC_RECEIVE라고 고친다.



9) 클래스 위저드를 열어서 두 번째 탭 Member Variables를 선택하고,
두 개의 에디트 박스와 연결되는 변수를 다음과 같이 지정한다.

Control IDs:
IDC_EDIT_LPARAM
IDC_EDIT_WPARAM

Type:
long
UINT

Member:
m_lParam
m_wParam



10) IPC3Dlg.cpp 파일의 메시지맵 부분에 다음과 같이 한 줄 추가한다.




11) 위의 메시지맵에 연결되는 핸들러를 작성한다.



12) 송수신 프로그램 두 개를 같이 실행한 다음 송신 프로그램에서
전송 버튼을 눌러 데이터를 보내면 된다.
"MFC" 카테고리의 다른 글
  • 프린트 다이얼로그를 안 띄우고 인쇄하기 (0)2007/05/16
  • 프로그램 내부적으로 해상도 변경하기. (0)2007/05/15
  • IPC (Inter Process Communication) (0)2007/05/15
  • CFile 클래스를 이용한 파일 I/O (0)2007/05/15
  • WaitForSingleObject() 에 의한 Thread 동기화 (0)2007/05/15
2007/05/15 10:03 2007/05/15 10:03
Posted by webdizen
Tags ATOM, IPC, PostMessage(), SendMessage(), WM_COPYDATA
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2959

Leave your greetings.

[로그인][오픈아이디란?]

Programming/MFC2007/02/21 10:31

ATOM을 이용한 프로세스간 데이터 공유

원본 : http://www.debuglab.com/knowledge/atom.html

1.요약

ATOM APT를 이용하여 프로세스간에 데이터를 전송하는 방법을 설명한다.


2.본문

보통 서로다른 프로세스간 데이터를 주고 받을때 shared memory나 clipboard를 이용합니다. 그러나 이런방법은 간단한 문자열이나 숫자를 전송할때 사용하기엔 부담스러운면이 있습니다. ATOM은 윈도우 개발자들이 DDE를 사용하기 위하여 만든것으로써 응용프로그램 개발자들도 손쉽게 데이터 공유에 이용할 수 있습니다.

사용법은 매우 간단합니다.

① 문자열 저장

ATOM atom = GlobalAddAtom("This is test!"); 


② 문자열 얻기

GlobalGetAtomName(atom, vc_b, 256);



3.예제

// 문자열 전송 서버 

ATOM atom = GlobalAddAtom("This is test!"); 



HWND hWnd = ::FindWindow(NULL, "AtomClinet"); 

::PostMessage(hWnd, WM_MYMSG, 0, atom); // atom값을 전송 



// 문자열 전송 클라이언트 

void CATOMClientDlg::OnGetMsg(WPARAM wParam, LPARAM lParam) 

{ 

    char vc_b[256]; 

    ATOM atom = (ATOM)lParam; 

    GlobalGetAtomName(atom, vc_b, 256); 

    // vc_b를 사용 

} 



- 2001.08.06 Smile Seo -
"MFC" 카테고리의 다른 글
  • 사용하지 않는 인자에 대한 warning 없애기 (0)2007/02/21
  • WM_COPYDATA 를 사용한 메세지 전송 (0)2007/02/21
  • ATOM을 이용한 프로세스간 데이터 공유 (0)2007/02/21
  • ToolBar에서 256이상의 Color사용 (0)2007/02/21
  • MDI/SDI 구조의 클래스간 포인터 획득 방법 (0)2007/01/29
2007/02/21 10:31 2007/02/21 10:31
Posted by webdizen
Tags ATOM
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2611

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 객체 삽입
  • 심리 테스트
  • JPEG
  • 시스템 공격
  • 웹 응용
  • 백업
  • 리소스 명령
  • 살아갈 날들을 위한 공부
  • 코드 보안
  • 형상화
  • 부자
  • Thread Pooling
  • 임페리얼 드래곤
  • Virtual Memory
  • 페이지 폴트
  • 더블 쿼테이션
  • Event
  • 심볼 링크
  • JDBC
  • 암호화

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.