ComObjActive() [v1.0.90+]

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를 사용하여 적절하게 포인터 사본을 놓아 주어야 합니다.

기본 행위는 앞으로 바뀔 수 있으므로, 인터페이스 포인터를 포장할 때 언제나 Flags1로 설정하기를 권장합니다. 그리고 필요하면 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._))
}
선택 | 내려받기