COM °´Ã¼¿¡ ÀÎÅÍÆäÀ̽º³ª ¼ºñ½º°¡ ÀÖ´ÂÁö ÁúÀÇÇÕ´Ï´Ù.
InterfacePointer := ComObjQuery(ComObject, [SID,] IID)
COM Æ÷Àå °´Ã¼ ¶Ç´Â ³¯ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ.
ÀÎÅÍÆäÀ̽º ½Äº°ÀÚ (GUID). Çü½Ä "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".
¼ºñ½º ½Äº°ÀÚ. IID¿Í Çü½ÄÀÌ °ª½À´Ï´Ù. ÀÌ ¸Å°³º¯¼ö°¡ »ý·«µÇ¸é, ½°Ç¥µµ »ý·«µË´Ï´Ù.
±×ÀÇ µÎ-¸Å°³º¯¼ö ¸ðµå¿¡¼, ÀÌ ÇÔ¼ö´Â IUnknown::QueryInterface¿Í µ¿µîÇÕ´Ï´Ù. SID¿Í IID ¸ðµÎ ÁöÁ¤µÇ¸é, ³»ºÎÀûÀ¸·Î IServiceProvider ÀÎÅÍÆäÀ̽º¿¡ ÁúÀÇÇÑ ´ÙÀ½, IServiceProvider::QueryService¸¦ È£ÃâÇÕ´Ï´Ù. ¾î´À °æ¿ìµç, ¹Ýȯ °ªÀº 0 À̰ųª ¾Æ´Ï¸é ¿äûµÈ ÀÎÅÍÆäÀ̽º¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÔ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÀÌ Æ÷ÀÎÅÍ´Â ¹Ýµå½Ã ½ºÅ©¸³Æ®°¡ ÀÏÀ» ¸¶Ä¥ ¶§ ÇØÁ¦µÇ¾î¾ß ÇÕ´Ï´Ù.
; ¿¹Á¦: °´Ã¼ÀÇ Å¬·¡½º À̸§À» ¾Ë¾Æ³À´Ï´Ù
obj := ComObjCreate("Scripting.Dictionary")
MsgBox % "Interface name: " ComObjType(obj, "name")
IID_IProvideClassInfo := "{B196B283-BAB4-101A-B69C-00AA00341D07}"
; ±× °´Ã¼ÀÇ IProvideClassInfo ÀÎÅÍÆäÀ̽º¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¿ä±¸ÇÕ´Ï´Ù.
if !(pci := ComObjQuery(obj, IID_IProvideClassInfo))
{
MsgBox IProvideClassInfo interface not supported.
return
}
; GetClassInfo¸¦ È£ÃâÇØ ITypeInfo ÀÎÅÍÆäÀ̽º¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¿¶÷ÇÕ´Ï´Ù.
DllCall(vtable(pci, 3), "ptr", pci, "ptr*", ti)
; GetDocumentationÀ» È£ÃâÇÏ¿© ±× °´Ã¼ÀÇ ¿ÏÀüÇÑ À¯Çü À̸§À» ¾ò½À´Ï´Ù.
DllCall(vtable(ti, 12), "ptr", ti, "int", -1, "ptr*", name, "ptr", 0, "ptr", 0, "ptr", 0)
; BSTR Æ÷ÀÎÅ͸¦ ¾µ¸ðÀÖ´Â ¹®ÀÚ¿·Î º¯È¯ÇÕ´Ï´Ù.
name := StrGet(name, "UTF-16")
; ³¯ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͵éÀ» ÇØÁ¦ÇÕ´Ï´Ù.
ObjRelease(ti)
ObjRelease(pci)
; À¯Çü À̸§À» º¸¿©ÁÝ´Ï´Ù!
MsgBox % "Class name: " name
vtable(ptr, n) {
; NumGet(ptr+0)Àº ±× °´Ã¼ÀÇ °¡»ó ÇÔ¼ö Å×À̺íÀÇ (¾àÀÚ·Î vtable)
; ÁÖ¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. Ç¥Çö½ÄÀÇ ³ª¸ÓÁö´Â n¹øÂ° ÇÔ¼öÀÇ ÁÖ¼Ò¸¦
; vtable·ÎºÎÅÍ ¿¶÷ÇÕ´Ï´Ù.
return NumGet(NumGet(ptr+0), n*A_PtrSize)
}
; ¿¹Á¦: ±âÁ¸ÀÇ ÀÎÅÍ³Ý ÀͽºÇ÷η¯ âÀ» ÀÚµ¿ÈÇϱâ.
sURL := "http://ahkscript.org/boards/"
if webBrowser := GetWebBrowser()
webBrowser.Navigate(sURL)
return
GetWebBrowser()
{
; ÃÖ»óÀ§ IE âÀÇ ¹®¼ °´Ã¼¸¦ °¡¸®Å°´Â ³¯ Æ÷ÀÎÅ͸¦ ¾ò½À´Ï´Ù.
static msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
SendMessage msg, 0, 0, Internet Explorer_Server1, ahk_class IEFrame
if ErrorLevel = FAIL
return ; IE°¡ ¹ß°ßµÇÁö ¾ÊÀ½.
lResult := ErrorLevel
DllCall("oleacc\ObjectFromLresult", "ptr", lResult
, "ptr", GUID(IID_IHTMLDocument2,"{332C4425-26CB-11D0-B483-00C04FD90119}")
, "ptr", 0, "ptr*", pdoc)
; WebBrowserApp ¼ºñ½º¿¡ ÁúÀÇÇÕ´Ï´Ù. ÀÌ Æ¯º°ÇÑ °æ¿ì´Â
; SID¿Í IID°¡ °°½À´Ï´Ù. ±×·¯³ª ¾ðÁ¦³ª ÀÌ·± °ÍÀº ¾Æ´Õ´Ï´Ù.
static IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
static SID_SWebBrowserApp := IID_IWebBrowserApp
pweb := ComObjQuery(pdoc, SID_SWebBrowserApp, IID_IWebBrowserApp)
; ¹®¼ °´Ã¼ Æ÷ÀÎÅ͸¦ Ç®¾îÁÝ´Ï´Ù.
ObjRelease(pdoc)
; WebBrowser °´Ã¼¸¦, »ç¿ëÀ» À§ÇØ Æ÷ÀåÇØ¼, ¹ÝȯÇÕ´Ï´Ù:
static VT_DISPATCH := 9, F_OWNVALUE := 1
return ComObject(VT_DISPATCH, pweb, F_OWNVALUE)
}
GUID(ByRef GUID, sGUID) ; ¹®ÀÚ¿À» ÀÌÁø GUID·Î º¯È¯ÇÏ°í ±×ÀÇ ÁÖ¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù.
{
VarSetCapacity(GUID, 16, 0)
return DllCall("ole32\CLSIDFromString", "wstr", sGUID, "ptr", &GUID) >= 0 ? &GUID : ""
}