Search
moon
sun
๐Ÿ‘๏ธ

COM Architecture : Interface Marshaling, IDispatch interface

Category
as S/W ์—”์ง€๋‹ˆ์–ด
Tags
COM
Created time
2008/01/18

Interface Marshaling

marshaling์˜ ๊ฐœ๋…

COM ์„œ๋ฒ„๋Š” ์œ„์น˜ ํˆฌ๋ช…์„ฑ์„ ์ง€์›ํ•œ๋‹ค. ์ฆ‰ COM ํด๋ผ์ด์–ธํŠธ์™€ ๋™์ผ ํ”„๋กœ์„ธ์Šค ๋‚ด์— ์žˆ๋˜(in-process server), ๋™์ผ ๋จธ์‹  ํƒ€ ํ”„๋กœ์„ธ์Šค๋กœ ์กด์žฌํ•˜๋˜์ง€(out-of-process server), remote ๋จธ์‹ ์— ์žˆ๊ฑด(remote server) ์ƒ๊ด€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ. marshaling์€ ์œ„์˜ ์„ธ ๊ฒฝ์šฐ ์ค‘ ํ”„๋กœ์„ธ์Šค ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” out-of-process server, remote server๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

marshaling์˜ ์ข…๋ฅ˜

โ€ข
standard marshaling, Automation marshaling, custom marshaling์˜ ์„ธ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, automation marshaling์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ„ ๊ต์ฐจ์ง€์›์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.
โ€ข
standard marshaling: MIDL ์ปดํŒŒ์ผ๋Ÿฌ๋Š” IDL(Interface Definition Language) ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ proxy์™€ stub๋ฅผ ๊ตฌํ˜„ํ•œ C ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. proxy๋Š” COM client์—, stub์€ COM server์— ๊ฐ๊ฐ ๋ถ™๋Š” ์–‘์ž๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.
โ€ข
Automation marshaling: automation์€ C++ ์ด์™ธ์˜ ์–ธ์–ด(์ฃผ๋กœ Visual Basic ๋˜๋Š” VBScript)๋กœ ์ž‘์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ COM ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.ย IDispatchย interface๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ Automation marshaling์„ ์ด๋ฃฌ๋‹ค. ์„ฑ๋Šฅ์ด standard marshaling์— ๋น„ํ•ด ๋–จ์–ด์ง€๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.
โ€ข
Custom marshaling: Standard marshaling์ด ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค. IMarshal interface ๊ตฌํ˜„์„ ํ†ตํ•ด ์ด๋ฃจ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ , (์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ) ๊ฐ’์— ์˜ํ•œ marshaling, (๋น„๋™๊ธฐ ํ˜ธ์ถœ ๋“ฑ์˜ ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ) Smart proxy, COM threading model ๋ฌด์‹œ ๋“ฑ์„ ์œ„ํ•ด custom marshaling์„ ์‚ฌ์šฉํ•œ๋‹ค.

IDispatch inteface

โ€ข
Automation์„ ์ด๋ฃจ๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ์ด๋‹ค. 4๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋ฉฐย Invoke()๋ฅผ ํ†ตํ•ด COM Server๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๊ฐ„์ ‘ํ˜ธ์ถœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.ย Invoke()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ๋Š” Automation ํ˜ธํ™˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์ฆ‰ย VARIANTย ํƒ€์ž…. Visual Basic์„ ์œ„ํ•œ Universal ํƒ€์ž…์œผ๋กœ์„œ, native ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ณธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์–‘์ž๊ฐ„์—์„œ ์™”๋‹ค๋ฆฌ๊ฐ”๋‹ค๋ฆฌํ•œ๋‹ค.
โ€ข
GetTypeInfoCount()๋Š” COM ๊ฐœ์ฒด๊ฐ€ ๋…ธ์ถœํ•˜๋Š” TypeInfo ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , GetTypeInfo()๋Š” Type Library์—์„œ Type ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, GetIDsOfNames()๋Š” COM ๊ฐœ์ฒด๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ string ํ˜•์‹์˜ ์ด๋ฆ„์„, Invoke()๋Š” ๋งคํ•‘๋œ ๋ฉ”์„œ๋“œ ๋ฒˆํ˜ธ(DISPID)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

Type Library

โ€ข
์„ฑ๋Šฅ๊ณผ tradeoffํ•œ automation์˜ ํ˜ธํ™˜์„ฑ์„ ๊ทธ๋Œ€๋กœ ๋‘” ์ฒด, ์„ฑ๋Šฅ์„ ๋” ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ตฌ์กฐ. ์ง์ ‘์ ์œผ๋กœ COM ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” inteface์—(vtable์—) ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” interface method ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…๊ณผ ๊ฐœ์ˆ˜๋ฅผ ์‚ฌ์ „์— ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋ฐ”๋กœ ์ด๋“ค ์‚ฌํ•ญ์„ Type Library๊ฐ€ ์ œ๊ณตํ•œ๋‹ค. interface์— ๋Œ€ํ•œ ์„ค๋ช…(description)์„ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ-๋กœ ๋‚˜ํƒ€๋‚ด๋Š” Type Library๋Š” C++ ํ—ค๋” ํŒŒ์ผ์˜ ์–ธ์–ด ๋…๋ฆฝ์ ์ธ ์ปดํŒŒ์ผ๋œ ๋ฒ„์ „์œผ๋กœ ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
โ€ข
IDL๋กœ ๊ธฐ์ˆ ๋œ Type Library๋ฅผ MIDL ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ tlb ํ™•์žฅ์ž์˜ ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•œ๋‹ค. ์ƒ์„ฑ๋œ tlb ํŒŒ์ผ์€ ์ข…์ข… COM ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ด๊ธด dll ๋˜๋Š” exe ํŒŒ์ผ์— ์—ฐ๊ฒฐ(link)๋œ๋‹ค.
โ€ข
COM ํด๋ผ์ด์–ธํŠธ๋Š” COM run-time ๋ผ์ด๋ธŒ๋Ÿฌ๋ฅผ ํ†ตํ•ด registry์—์„œ Type Library๋ฅผ ์ฐพ์•„ ์ ‘๊ทผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ registry์—๋Š” ํ•ด๋‹น Type Library๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
โ€ข
HKEY_CLASSES_ROOT\TypeLib ํ•˜์œ„์— ์œ„์น˜ํ•˜๋Š” Type Library ์œ„์น˜์ •๋ณด๋Š” LIBID๋กœ ๊ฐ Type Library๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๋‹น ์—”ํŠธ๋ฆฌ ํ•˜์œ„์˜ win32 ์—”ํŠธ๋ฆฌ์— ํ•ด๋‹น Type Library๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์˜ path๊ฐ€ ๋‹ด๊ธด๋‹ค.

Dual Interface

C++ ๋ฐ ๋น„ C++ ๊ธฐ๋ฐ˜ COM ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” dispatch ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ vtable์— IDispatch interface์˜ Invoke() ๋ฉ”์„œ๋“œ ๋’ค๋กœ ํ•ด๋‹น COM ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด C++ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ๋น„ C++ ํด๋ผ์ด์–ธํŠธ๋Š” Invoke()๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€๋ฆฌ์ผœ dual interface๋ผ ํ•œ๋‹ค.

References

โ€ข
Desktop Applications with Microsoft Visual C++ 6.0 MCSD Training Kit
โ€ข
MSDN