ComObjActive() [AHK_L 53+]

OLE·Î µî·ÏµÇ¾î ½ÇÇà ÁßÀÎ °´Ã¼¸¦ ¿­¶÷ÇÕ´Ï´Ù.

ComObject := ComObjActive(CLSID)

¸Å°³º¯¼ö³ª ¹Ýȯ °ª¿¡ °Ç³Ú À¯Çü ÀÖ´Â °ªÀ» ³ªÅ¸³»´Â °´Ã¼¸¦ ¸¸µì´Ï´Ù.

ParamObj := ComObject(VarType, Value [, Flags])

Àý´ë ºñÃßõ:

¾Æ·¡¿¡ º¸¿©ÁÖ´Â »ç¿ë¹ýÀº ÃßõÇÏÁö ¾Ê½À´Ï´Ù. ¾ÕÀ¸·Î´Â »ç¿ëÀÌ ºÒ°¡´ÉÇϰųª ¹Ù²ð ¼ö ÀÖ½À´Ï´Ù.

COM °´Ã¼ÀÇ ¸Þ½îµå¸¦ È£ÃâÇÒ ¶§ ¼±ÅÃÀûÀÎ ¸Å°³º¯¼öÀÇ ±âº» °ª ´ë½Å¿¡ »ç¿ëÇÒ °´Ã¼¸¦ ¸¸µì´Ï´Ù. v1.1.12ºÎÅÍ Æó±âµÇ¾ú½À´Ï´Ù: ´ë½Å¿¡ ±×³É µÎ °³ÀÇ ½°Ç¥¸¦ ¿¬¼ÓÀûÀ¸·Î »ç¿ëÇϽʽÿÀ. ´ÙÀ½°ú °°ÀÌ: Obj.Method(1,,3)

ParamObj := ComObjMissing()

IDispatch Æ÷ÀÎÅ͸¦ °´Ã¼¿¡ ½Î ³Ö°í ÀÚµ¿À¸·Î AddRef¸¦ È£ÃâÇÕ´Ï´Ù.

ComObject := ComObjEnwrap(DispPtr)
DispPtr := ComObjUnwrap(ComObject)

¹Ì·¡¸¦ º¸ÀåÇÏ´Â Äڵ带 ÀÛ¼ºÇÏ·Á¸é, ´ë½Å ´ÙÀ½°ú °°ÀÌ »ç¿ëÇϽʽÿÀ:

ComObject := ComObject(9, DispPtr, 1), ObjAddRef(DispPtr)
DispPtr := ComObjValue(ComObject), ObjAddRef(DispPtr)

¸Å°³º¯¼ö

CLSID

CLSID ¶Ç´Â »ç¶÷ÀÌ-ÀÐÀ» ¼ö ÀÖ´Â COM °´Ã¼ÀÇ Prog ID.

ComObject

°´Ã¼ ±¸¹®¿¡ »ç¿ë°¡´ÉÇÑ COM °´Ã¼.

VarType

°ªÀÇ À¯ÇüÀ» ³ªÅ¸³»´Â Á¤¼ö. À¯Çü ¸ñ·ÏÀº ComObjType()À» ÂüÁ¶ÇϽʽÿÀ.

Value

Æ÷ÀåÇÒ °ª. ÇöÀç ¿ÀÁ÷ Á¤¼ö¿Í Æ÷ÀÎÅÍ °ª¸¸ Áö¿øÇÕ´Ï´Ù.

Flags

ÀÌ ÇÔ¼öÀÇ ÇàÀ§¿Í Æ÷Àå °´Ã¼ÀÇ ÇàÀ§¿¡ ¿µÇâÀ» ÁÖ´Â Ç÷¡±×; ¾Æ·¡ ÂüÁ¶.

DispPtr

³¯ IDispatch Æ÷ÀÎÅÍ.

Ç÷¡±×

 0 

±âº» ÇàÀ§. AddRef´Â IUnknown°ú IDispatch Æ÷ÀÎÅÍ¿¡ ´ëÇÏ¿© ÀÚµ¿À¸·Î È£ÃâµË´Ï´Ù. ±×·¡¼­ È£ÃâÀÚ´Â ObjRelease¸¦ »ç¿ëÇÏ¿© ÀûÀýÇÏ°Ô Æ÷ÀÎÅÍ »çº»À» ³õ¾Æ ÁÖ¾î¾ß ÇÕ´Ï´Ù.

±âº» ÇàÀ§´Â ¾ÕÀ¸·Î ¹Ù²ð ¼ö ÀÖÀ¸¹Ç·Î, ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ Æ÷ÀåÇÒ ¶§ ¾ðÁ¦³ª Flags¸¦ 1·Î ¼³Á¤Çϱ⸦ ±ÇÀåÇÕ´Ï´Ù. ±×¸®°í ÇÊ¿äÇϸé ObjAddRef()¸¦ È£ÃâÇϱ⸦ ±ÇÀåÇÕ´Ï´Ù.

 1  IUnknown, IDispatch ¶Ç´Â SAFEARRAY Æ÷ÀÎÅÍÀÇ ¼ÒÀ¯±ÇÀ» ȹµæÇÕ´Ï´Ù. AddRef´Â È£ÃâµÇÁö ¾Ê½À´Ï´Ù. Æ÷Àå °´Ã¼¿¡ SAFEARRAY°¡ µé¾î ÀÖÀ¸¸é (VT_BYREF´Â Á¦¿Ü), Æ÷Àå °´Ã¼°¡ ÇØÁ¦µÉ ¶§ SafeArrayDestroy°¡ ÀÚµ¿À¸·Î È£ÃâµË´Ï´Ù.

ByRef [v1.1.17+]

Æ÷Àå °´Ã¼ÀÇ VarType¿¡ VT_BYREF (0x4000) Ç÷¡±×°¡ µé¾î ÀÖÀ¸¸é, ºó °¢°ýÈ£[]¸¦ »ç¿ëÇÏ¿© ÂüÁ¶µÈ °ªÀ» Àаųª ¾µ ¼ö ÀÖ½À´Ï´Ù.

ÂüÁ¶¸¦ »ý¼ºÇÒ ¶§, Value´Â ¹Ýµå½Ã ÁÖ¾îÁø À¯ÇüÀÇ °ªÀ» ÀúÀåÇϱ⿡ ÃæºÐÇÑ °¡¿ë ´É·ÂÀÌ ÀÖ´Â º¯¼ö³ª ¹öÆÛÀÇ ¸Þ¸ð¸® ÁÖ¼ÒÀ̾î¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½À» »ç¿ëÇϸé VBScript ÇÔ¼ö°¡ ¾µ ¼ö ÀÖ´Â º¯¼ö¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù:

VarSetCapacity(var, 24, 0)
vref := ComObject(0x400C, &var)  ; 0x400C´Â VT_BYREF¿Í VT_VARIANTÀÇ Á¶ÇÕÀÔ´Ï´Ù.

vref[] := "in value"
sc.Run("Example", vref)  ; sc´Â ¹Ýµå½Ã ¾Æ·¡ÀÇ ¿¹Á¦¿Í °°ÀÌ ÃʱâÈ­µÇ¾î¾ß ÇÕ´Ï´Ù.
MsgBox % vref[]

ÃÑÆò

ÇöÀç ¹öÀü¿¡¼­, "ComObj"·Î ½ÃÀÛÇÏ´Â ÇÔ¼ö°¡ ´Ù¸¥ COM ÇÔ¼ö Áß Çϳª¿Í ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é ½ÇÁ¦·Î´Â ComObjActive¸¦ È£ÃâÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ComObjEnwrap(DispPtr)¿Í ComObjActive(DispPtr)´Â ¸ðµÎ ComObject(DispPtr)¿Í µ¿µîÇÕ´Ï´Ù (¹¬½ÃÀûÀ¸·Î VarTypeÀº 9ÀÔ´Ï´Ù). ±×·¸Áö¸¸, ÀÌ ÇàÀ§´Â ¾ÕÀ¸·Î »ç¿ëÇÏÁö ¸øÇÒ °ÍÀÔ´Ï´Ù. ±×·¡¼­ ÀÌ ÆäÀÌÁö¿¡¼­ º¸¿©ÁÖ´Â ¹Ù¿Í °°ÀÌ ComObject()¿Í ComObjActive()¸¸ »ç¿ëÇÏ´Â °ÍÀÌ Á¦ÀÏ ÁÁ½À´Ï´Ù.

IDispatch³ª IUnknown ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅ͸¦ Æ÷ÀåÇϰųª ¿­¶÷ÇÏ´Â µ¥ ÀÌ ÇÔ¼ö°¡ »ç¿ëµÉ ¶§, ±âº» ÇàÀ§´Â COM °´Ã¼ÀÇ ÂüÁ¶ Ƚ¼ö¸¦ ´Ã¸®´Â °ÍÀÔ´Ï´Ù. ±×·¯¹Ç·Î, ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ´Â ´õ ÀÌ»ó ÇÊ¿äÇÏÁö ¾ÊÀ» ¶§ ¼öµ¿À¸·Î ÇØÁ¦ÇØ¾ß ÇÕ´Ï´Ù. Æ÷Àå °´Ã¼°¡ ÇØÁ¦µÉ ¶§, ±× ¾È¿¡ µç ÂüÁ¶´Â ÀÚµ¿À¸·Î ÇØÁ¦µË´Ï´Ù.

¾Ë·ÁÁø ÇÑ°è: COM °´Ã¼°¡ Æ÷ÀåµÉ ¶§¸¶´Ù, »õ Æ÷Àå °´Ã¼°¡ »ý¼ºµË´Ï´Ù. obj1 == obj2 ±×¸®°í array[obj1] := value¿Í °°Àº ºñ±³¿Í ÇÒ´çÀº °°Àº COM °´Ã¼¸¦ Æ÷ÇÔÇÏ°í ÀÖÀ» Áö¶óµµ µÎ °³ÀÇ Æ÷Àå °´Ã¼¸¦ À¯ÀÏÇÑ °ÍÀ¸·Î Ãë±ÞÇÕ´Ï´Ù.

ComObjCreate, ComObjGet, ComObjConnect, ComObjError, ComObjFlags, ObjAddRef/ObjRelease, ComObjQuery, GetActiveObject (MSDN)

¿¹Á¦

ComObjUnwrap: ´ÙÀ½ ÂüÁ¶ ComObjConnect.

; ¿©´Â ¸»- ScriptControlÀº 32-ºñÆ® ¹öÀüÀÇ ¿ÀÅäÇÖÅ°¸¦ ¿ä±¸ÇÕ´Ï´Ù.
code =
(
Sub Example(Var)
    MsgBox Var
    Var = "out value!"
End Sub
)
sc := ComObjCreate("ScriptControl"), sc.Language := "VBScript", sc.AddCode(code)


; ¿¹Á¦: VARIANT ByRef¸¦ COM ÇÔ¼ö¿¡ °Ç³Ü´Ï´Ù.
var := ComVar()
var[] := "in value"
sc.Run("Example", var.ref)
MsgBox % var[]


; ComVar: °ªÀ» ByRef·Î °Ç³×´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù.
;   ComVar[] °ªÀ» ¿­¶÷ÇÕ´Ï´Ù
;   ComVar[] := ValÀº °ªÀ» ¼³Á¤ÇÕ´Ï´Ù
;   ComVar.ref´Â COM ÇÔ¼ö¿¡ °Ç³×±â À§ÇØ ByRef °´Ã¼¸¦ ¿­¶÷ÇÕ´Ï´Ù.
ComVar(Type=0xC)
{
    static base := { __Get: "ComVarGet", __Set: "ComVarSet", __Delete: "ComVarDel" }
    ; 1 VARIANTÀÇ ¹è¿­À» ¸¸µì´Ï´Ù.  ÀÌ ¹æ¹ýÀ¸·Î ¸ðµç ³»Àå ÄÚµå´Â 
    ; VARIANT¿Í AutoHotkey ³»ºÎ À¯Çü »çÀÌÀÇ ¸ðµç º¯È¯À» ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
    arr := ComObjArray(Type, 1)
    ; ±× ¹è¿­À» Àá±×°í VARIANT¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¿­¶÷ÇÕ´Ï´Ù.
    DllCall("oleaut32\SafeArrayAccessData", "ptr", ComObjValue(arr), "ptr*", arr_data)
    ; ±× ¹è¿­À» ÀúÀåÇÕ´Ï´Ù. ±×¸®°í VARIANT ByRef¸¦ °Ç³×´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â °´Ã¼¸¦ ÀúÁ¤ÇÕ´Ï´Ù.
    return { ref: ComObject(0x4000|Type, arr_data), _: arr, base: base }
}

ComVarGet(cv, p*) { ; ½ºÅ©¸³Æ®°¡ ¹ÌÁöÀÇ Çʵ忡 Á¢±ÙÇϸé È£ÃâµË´Ï´Ù.
    if p.MaxIndex() = "" ; À̸§/¸Å°³º¯¼ö ¾øÀ½. Áï, cv[]
        return cv._[0]
}

ComVarSet(cv, v, p*) { ; ½ºÅ©¸³Æ®°¡ ¹ÌÁöÀÇ Çʵ带 ¼³Á¤ÇÒ ¶§ È£ÃâµË´Ï´Ù.
    if p.MaxIndex() = "" ; À̸§/¸Å°³º¯¼ö ¾øÀ½. Áï, cv[]:=v
        return cv._[0] := v
}

ComVarDel(cv) { ; °´Ã¼°¡ ÇØÁ¦µÉ ¶§ È£ÃâµË´Ï´Ù.
    ; ÀÌ°ÍÀÌ ¼º°øÇØ¾ß ³»ºÎ ¹è¿­ÀÌ ÇØÁ¦µÉ ¼ö ÀÖ½À´Ï´Ù.
    DllCall("oleaut32\SafeArrayUnaccessData", "ptr", ComObjValue(cv._))
}