728x90
;By Sean
VTable(ppv, idx)
{
Return NumGet(NumGet(1*ppv)+4*idx)
}
QueryInterface(ppv, ByRef IID)
{
If StrLen(IID) = 38
GUID4String(IID, IID)
DllCall(NumGet(NumGet(1*ppv)), "Uint", ppv, "str", IID, "UintP", ppv)
Return ppv
}
AddRef(ppv)
{
Return DllCall(NumGet(NumGet(1*ppv)+4), "Uint", ppv)
}
Release(ppv)
{
Return DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv)
}
QueryService(ppv, ByRef SID, ByRef IID)
{
If StrLen(SID) = 38
GUID4String(SID, SID)
If StrLen(IID) = 38
GUID4String(IID, IID)
GUID4String(IID_IServiceProvider, "{6D5140C1-7436-11CE-8034-00AA006009FA}")
DllCall(NumGet(NumGet(1*ppv)+4*0), "Uint", ppv, "str", IID_IServiceProvider, "UintP", psp)
DllCall(NumGet(NumGet(1*psp)+4*3), "Uint", psp, "str", SID, "str", IID, "UintP", ppv)
DllCall(NumGet(NumGet(1*psp)+4*2), "Uint", psp)
Return ppv
}
GetIDispatch(ppv, LCID = 0)
{
DllCall(NumGet(NumGet(1*ppv)+12), "Uint", ppv, "UintP", cti)
If !cti
Return
DllCall(NumGet(NumGet(1*ppv)+16), "Uint", ppv, "Uint", 0, "Uint", LCID, "UintP", pti)
DllCall(NumGet(NumGet(1*pti)+12), "Uint", pti, "UintP", pattr)
DllCall(NumGet(NumGet(1*ppv)+ 0), "Uint", ppv, "Uint" , pattr, "UintP", pdisp)
DllCall(NumGet(NumGet(1*pti)+76), "Uint", pti, "Uint" , pattr)
DllCall(NumGet(NumGet(1*pti)+ 8), "Uint", pti)
If pdisp
DllCall(NumGet(NumGet(1*ppv)+ 8), "Uint", ppv)
Return pdisp
}
Invoke(pdisp, sName, arg1="vT_NoNe",arg2="vT_NoNe",arg3="vT_NoNe",arg4="vT_NoNe",arg5="vT_NoNe",arg6="vT_NoNe",arg7="vT_NoNe",arg8="vT_NoNe",arg9="vT_NoNe")
{
nParams:=0
Loop, 9
{
If (arg%A_Index% == "vT_NoNe")
Break
nParams++
}
VarSetCapacity(DispParams,4*4,0), VarSetCapacity(varResult,8*2,0), VarSetCapacity(IID_NULL,16,0), VarSetCapacity(varg,16*nParams,0)
NumPut(&varg,DispParams,0), NumPut(nParams,DispParams,8)
If (nFlags := SubStr(sName,0) <> "=" ? 3 : 12) = 12
NumPut(&varResult,DispParams,4), NumPut(1,DispParams,12), NumPut(-3,varResult), sName:=SubStr(sName,1,-1)
Loop, %nParams%
{
If arg%A_Index% Is Not Integer
NumPut(8,varg,16*(nParams-A_Index),"Ushort"), NumPut(SysAllocString(arg%A_Index%),varg,16*(nParams-A_Index)+8)
Else NumPut(SubStr(arg%A_Index%,1,1)="+" ? 9 : 3,varg,16*(nParams-A_Index),"Ushort"), NumPut(arg%A_Index%,varg,16*(nParams-A_Index)+8)
}
DllCall(NumGet(NumGet(1*pdisp)+20), "Uint", pdisp, "str", IID_NULL, "UintP", Unicode4Ansi(wName, sName), "Uint", 1, "Uint", LCID, "intP", dispID)
DllCall(NumGet(NumGet(1*pdisp)+24), "Uint", pdisp, "int", dispID, "str", IID_NULL, "Uint", LCID, "Ushort", nFlags, "Uint", &DispParams, "Uint", &varResult, "Uint", 0, "Uint", 0)
Loop, %nParams%
NumGet(varg,16*(A_Index-1),"Ushort")=8 ? SysFreeString(NumGet(varg,16*(A_Index-1)+8)) : ""
If nFlags = 3
InStr(" 0 4 5 6 7 14 "," " . NumGet(varResult,0,"Ushort") . " ") ? DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",0,"Ushort",8) : "", NumGet(varResult,0,"Ushort")=8 ? (hResult:=Ansi4Unicode(NumGet(varResult,8))) . SysFreeString(NumGet(varResult,8)) : hResult:=NumGet(varResult,8)
Return hResult
}
Invoke_(pdisp, sName, type1="",arg1="",type2="",arg2="",type3="",arg3="",type4="",arg4="",type5="",arg5="",type6="",arg6="",type7="",arg7="",type8="",arg8="",type9="",arg9="")
{
Global _TEMP_VT_BYREF_
nParams:=0
Loop, 9
{
If (type%A_Index% = "")
Break
nParams++
}
VarSetCapacity(dispParams,4*4,0), VarSetCapacity(varResult,8*2,0), VarSetCapacity(IID_NULL,16,0), VarSetCapacity(varg,16*nParams,0)
NumPut(&varg,dispParams,0), NumPut(nParams,dispParams,8)
If (nFlags := SubStr(sName,0) <> "=" ? 1|2 : 4|8) & 12
NumPut(&varResult,dispParams,4), NumPut(1,dispParams,12), NumPut(-3,varResult), sName:=SubStr(sName,1,-1)
Loop, %nParams%
NumPut(type%A_Index%,varg,16*(nParams-A_Index),"Ushort"), type%A_Index%&0x4000=0 ? NumPut(type%A_Index%=8 ? SysAllocString(arg%A_Index%) : arg%A_Index%,varg,16*(nParams-A_Index)+8,type%A_Index%=5||type%A_Index%=7 ? "double" : type%A_Index%=4 ? "float" : "int64") : type%A_Index%=0x400C||type%A_Index%=0x400E ? NumPut(arg%A_Index%,varg,(nParams-A_Index)*16+8) : VarSetCapacity(ref%A_Index%,8,0) . NumPut(&ref%A_Index%,varg,16*(nParams-A_Index)+8) . NumPut(type%A_Index%=0x4008 ? SysAllocString(arg%A_Index%) : arg%A_Index%,ref%A_Index%,0,type%A_Index%=0x4005||type%A_Index%=0x4007 ? "double" : type%A_Index%=0x4004 ? "float" : "int64")
DllCall(NumGet(NumGet(1*pdisp)+20), "Uint", pdisp, "str", IID_NULL, "UintP", Unicode4Ansi(wName, sName), "Uint", 1, "Uint", LCID, "intP", dispID)
DllCall(NumGet(NumGet(1*pdisp)+24), "Uint", pdisp, "int", dispID, "str", IID_NULL, "Uint", LCID, "Ushort", nFlags, "Uint", &dispParams, "Uint", &varResult, "Uint", 0, "Uint", 0)
Loop, %nParams%
type%A_Index%&0x4000=0 ? (type%A_Index%=8 ? SysFreeString(NumGet(varg,16*(nParams-A_Index)+8)) : "") : type%A_Index%=0x400C||type%A_Index%=0x400E ? "" : type%A_Index%=0x4008 ? (_TEMP_VT_BYREF_%A_Index%:=Ansi4Unicode(NumGet(ref%A_Index%))) . SysFreeString(NumGet(ref%A_Index%)) : (_TEMP_VT_BYREF_%A_Index%:=NumGet(ref%A_Index%,0,type%A_Index%=0x4005||type%A_Index%=0x4007 ? "double" : type%A_Index%=0x4004 ? "float" : "int64"))
If nFlags & 3
InStr(" 0 4 5 6 7 14 "," " . NumGet(varResult,0,"Ushort") . " ") ? DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",0,"Ushort",8) : "", NumGet(varResult,0,"Ushort")=8 ? (hResult:=Ansi4Unicode(NumGet(varResult,8))) . SysFreeString(NumGet(varResult,8)) : (hResult:=NumGet(varResult,8))
Return hResult
}
CreateObject(ByRef CLSID, ByRef IID, CLSCTX = 5)
{
If StrLen(CLSID) = 38
GUID4String(CLSID, CLSID)
If StrLen(IID) = 38
GUID4String(IID, IID)
DllCall("ole32\CoCreateInstance", "str", CLSID, "Uint", 0, "Uint", CLSCTX, "str", IID, "UintP", ppv)
Return ppv
}
ActiveXObject(ProgID, CLSCTX = 5)
{
InStr(ProgID, "{") ? GUID4String(CLSID, ProgID) : CLSID4ProgID(CLSID, ProgID)
GUID4String(IID_IDispatch, "{00020400-0000-0000-C000-000000000046}")
DllCall("ole32\CoCreateInstance", "str", CLSID, "Uint", 0, "Uint", CLSCTX, "str", IID_IDispatch, "UintP", ppv)
Return (pdisp := GetIDispatch(ppv)) ? pdisp : ppv
}
GetObject(Moniker)
{
Ansi2Unicode(Moniker, wMoniker)
GUID4String(IID_IDispatch, "{00020400-0000-0000-C000-000000000046}")
DllCall("ole32\CoGetObject", "str", wMoniker, "Uint", 0, "str", IID_IDispatch, "UintP", ppv)
Return (pdisp := GetIDispatch(ppv)) ? pdisp : ppv
}
GetActiveObject(ProgID)
{
InStr(ProgID, "{") ? GUID4String(CLSID, ProgID) : CLSID4ProgID(CLSID, ProgID)
GUID4String(IID_IDispatch, "{00020400-0000-0000-C000-000000000046}")
DllCall("oleaut32\GetActiveObject", "str", CLSID, "Uint", 0, "UintP", punk)
DllCall(NumGet(NumGet(1*punk)+0), "Uint", punk, "str", IID_IDispatch, "UintP", ppv)
DllCall(NumGet(NumGet(1*punk)+8), "Uint", punk)
Return (pdisp := GetIDispatch(ppv)) ? pdisp : ppv
}
CLSID4ProgID(ByRef CLSID, sProgID, nOffset = 0)
{
VarSetCapacity(CLSID, 16 + nOffset)
Ansi2Unicode(sProgID, wProgID)
DllCall("ole32\CLSIDFromProgID", "Uint", &wProgID, "Uint", &CLSID + nOffset)
Return &CLSID
}
ProgID4CLSID(ByRef CLSID, nOffset = 0)
{
pCLSID := CLSID + 0 > 65535 ? CLSID : &CLSID
DllCall("ole32\ProgIDFromCLSID", "Uint", pCLSID + nOffset, "UintP", pProgID)
Unicode2Ansi(pProgID, sProgID)
CoTaskMemFree(pProgID)
Return sProgID
}
GUID4String(ByRef CLSID, sString, nOffset = 0)
{
VarSetCapacity(CLSID, 16 + nOffset)
Ansi2Unicode(sString, wString, 38)
DllCall("ole32\CLSIDFromString", "Uint", &wString, "Uint", &CLSID + nOffset)
Return &CLSID
}
String4GUID(ByRef GUID, nOffset = 0)
{
pGUID := GUID + 0 > 65535 ? GUID : &GUID
VarSetCapacity(wString, 38 * 2 + 1)
DllCall("ole32\StringFromGUID2", "Uint", pGUID + nOffset, "Uint", &wString, "int", 38 + 1)
Unicode2Ansi(wString, sString, 38)
Return sString
}
CoCreateGuid()
{
VarSetCapacity(GUID, 16, 0)
DllCall("ole32\CoCreateGuid", "Uint", &GUID)
Return String4GUID(GUID)
}
CoTaskMemAlloc(cb)
{
Return DllCall("ole32\CoTaskMemAlloc", "Uint", cb)
}
CoTaskMemFree(pv)
{
Return DllCall("ole32\CoTaskMemFree", "Uint", pv)
}
CoInitialize()
{
Return DllCall("ole32\CoInitialize", "Uint", 0)
}
CoUninitialize()
{
Return DllCall("ole32\CoUninitialize")
}
OleInitialize()
{
Return DllCall("ole32\OleInitialize", "Uint", 0)
}
OleUninitialize()
{
Return DllCall("ole32\OleUninitialize")
}
SysAllocString(sString)
{
Return DllCall("oleaut32\SysAllocString", "Uint", Ansi2Unicode(sString, wString))
}
SysFreeString(pString)
{
Return DllCall("oleaut32\SysFreeString", "Uint", pString)
}
Ansi4Unicode(pString, nSize = 0)
{
If !nSize
nSize := DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0)
VarSetCapacity(sString, nSize)
DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize + 1, "Uint", 0, "Uint", 0)
Return sString
}
Unicode4Ansi(ByRef wString, sString, nSize = 0)
{
If !nSize
nSize := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nSize * 2 + 1)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize + 1)
Return &wString
}
Ansi2Unicode(ByRef sString, ByRef wString, nSize = 0)
{
If !nSize
nSize := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nSize * 2 + 1)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize + 1)
Return &wString
}
Unicode2Ansi(ByRef wString, ByRef sString, nSize = 0)
{
pString := wString + 0 > 65535 ? wString : &wString
If !nSize
nSize := DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0)
VarSetCapacity(sString, nSize)
DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize + 1, "Uint", 0, "Uint", 0)
Return &sString
}
DecodeInteger(ref, nSize = 4)
{
DllCall("RtlMoveMemory", "int64P", val, "Uint", ref, "Uint", nSize)
Return val
}
EncodeInteger(ref, val = 0, nSize = 4)
{
DllCall("RtlMoveMemory", "Uint", ref, "int64P", val, "Uint", nSize)
}
CoHelper.ahk
0.01MB
728x90
'AutoHotKey' 카테고리의 다른 글
Ahk Standard Library Collection, 2014 May (+Gui) ~ Libs: 100 (0) | 2023.08.29 |
---|---|
AutoHotkey 설치 (0) | 2023.08.29 |
COM.ahk (0) | 2023.08.28 |
[GUI] Auto 자동종료 (0) | 2023.08.27 |
[GUI] Countdown Timer (0) | 2023.08.27 |