1 ;------------------------------------------------------------------------------
2 ; COM.ahk Standard Library
4 ; http://www.autohotkey.com/forum/topic22923.html
5 ;------------------------------------------------------------------------------
9 Return DllCall("ole32\OleInitialize", "Uint", 0)
14 Return DllCall("ole32\OleUninitialize")
19 Return NumGet(NumGet(1*ppv)+4*idx)
22 COM_QueryInterface(ppv, IID = "")
24 If DllCall(NumGet(NumGet(1*ppv)+0), "Uint", ppv, "Uint", COM_GUID4String(IID,IID ? IID : IID=0 ? "{00000000-0000-0000-C000-000000000046}" : "{00020400-0000-0000-C000-000000000046}"), "UintP", ppv)=0
30 Return DllCall(NumGet(NumGet(1*ppv)+4), "Uint", ppv)
35 Return DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv)
38 COM_QueryService(ppv, SID, IID = "")
40 DllCall(NumGet(NumGet(1*ppv)+4*0), "Uint", ppv, "Uint", COM_GUID4String(IID_IServiceProvider,"{6D5140C1-7436-11CE-8034-00AA006009FA}"), "UintP", psp)
41 DllCall(NumGet(NumGet(1*psp)+4*3), "Uint", psp, "Uint", COM_GUID4String(SID,SID), "Uint", IID ? COM_GUID4String(IID,IID) : &SID, "UintP", ppv:=0)
42 DllCall(NumGet(NumGet(1*psp)+4*2), "Uint", psp)
46 COM_FindConnectionPoint(pdp, DIID)
48 DllCall(NumGet(NumGet(1*pdp)+ 0), "Uint", pdp, "Uint", COM_GUID4String(IID_IConnectionPointContainer, "{B196B284-BAB4-101A-B69C-00AA00341D07}"), "UintP", pcc)
49 DllCall(NumGet(NumGet(1*pcc)+16), "Uint", pcc, "Uint", COM_GUID4String(DIID,DIID), "UintP", pcp)
50 DllCall(NumGet(NumGet(1*pcc)+ 8), "Uint", pcc)
54 COM_GetConnectionInterface(pcp)
56 VarSetCapacity(DIID, 16, 0)
57 DllCall(NumGet(NumGet(1*pcp)+12), "Uint", pcp, "Uint", &DIID)
58 Return COM_String4GUID(&DIID)
61 COM_Advise(pcp, psink)
63 DllCall(NumGet(NumGet(1*pcp)+20), "Uint", pcp, "Uint", psink, "UintP", nCookie)
67 COM_Unadvise(pcp, nCookie)
69 Return DllCall(NumGet(NumGet(1*pcp)+24), "Uint", pcp, "Uint", nCookie)
72 COM_Enumerate(penum, ByRef Result, ByRef vt = "")
74 VarSetCapacity(varResult,16,0)
75 If (0 = hr:=DllCall(NumGet(NumGet(1*penum)+12), "Uint", penum, "Uint", 1, "Uint", &varResult, "UintP", 0))
76 Result:=(vt:=NumGet(varResult,0,"Ushort"))=8||vt<0x1000&&DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",1,"Ushort",8)=0 ? COM_Ansi4Unicode(bstr:=NumGet(varResult,8)) . COM_SysFreeString(bstr) : NumGet(varResult,8)
80 COM_Invoke(pdsp,name="",prm0="vT_NoNe",prm1="vT_NoNe",prm2="vT_NoNe",prm3="vT_NoNe",prm4="vT_NoNe",prm5="vT_NoNe",prm6="vT_NoNe",prm7="vT_NoNe",prm8="vT_NoNe",prm9="vT_NoNe")
83 Return COM_Release(pdsp)
86 SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . ".",COM_AddRef(pdsp)
94 Else If name not contains [,(
96 Else If InStr("])",SubStr(name,0))
97 Loop, Parse, name, [(,'")]
100 Else prmn := A_LoopField
103 name .= "." . A_LoopField
107 pdsp:= COM_Invoke(pdsp,name,prmn!="" ? prmn:"vT_NoNe")+COM_Release(pdsp)*0,name:=A_LoopField
108 Else Return prmn!="" ? COM_Invoke(pdsp,name,prmn,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8):COM_Invoke(pdsp,name,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8,prm9),COM_Release(pdsp)
111 sParams := "0123456789"
113 If (prm%A_LoopField% == "vT_NoNe")
115 sParams := SubStr(sParams,1,A_Index-1)
118 VarSetCapacity(varg,16*nParams:=StrLen(sParams),0), VarSetCapacity(DispParams,16,0), VarSetCapacity(varResult,32,0), VarSetCapacity(ExcepInfo,32,0)
120 ; If prm%A_LoopField%+0=="" || InStr(prm%A_LoopField%,".") || prm%A_LoopField%>=0x80000000 || prm%A_LoopField%<-0x80000000
121 If prm%A_LoopField% is not integer
122 NumPut(COM_SysAllocString(prm%A_LoopField%),NumPut(8,varg,(nParams-A_Index)*16),4)
123 Else NumPut(SubStr(prm%A_LoopField%,1,1)="+" ? 9:prm%A_LoopField%=="-0" ? (prm%A_LoopField%:=0x80020004)*0+10:3,NumPut(prm%A_LoopField%,varg,(nParams-A_Index)*16+8),-12,"Ushort")
125 NumPut(nParams,NumPut(&varg,DispParams),4)
126 If (nvk := SubStr(name,0)="=" ? 12:3)=12
127 name := SubStr(name,1,-1),NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)
128 Global COM_HR, COM_LR:=""
129 If (COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+20),"Uint",pdsp,"Uint",&varResult+16,"UintP",COM_Unicode4Ansi(wname,name),"Uint",1,"Uint",LCID,"intP",dispID,"Uint"))=0&&(COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",nvk,"Uint",&DispParams,"Uint",&varResult,"Uint",&ExcepInfo,"Uint",0,"Uint"))!=0&&nParams&&nvk!=12&&(COM_LR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",12,"Uint",NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)-16,"Uint",0,"Uint",0,"Uint",0,"Uint"))=0
132 NumGet(varg,(A_Index-1)*16,"Ushort")=8 ? COM_SysFreeString(NumGet(varg,(A_Index-1)*16+8)) : ""
133 Global COM_VT := NumGet(varResult,0,"Ushort")
134 Return COM_HR=0 ? COM_VT>1 ? COM_VT=8||COM_VT<0x1000&&DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",1,"Ushort",8)=0 ? COM_Ansi4Unicode(bstr:=NumGet(varResult,8)) . COM_SysFreeString(bstr):NumGet(varResult,8):"":COM_Error(COM_HR,COM_LR,&ExcepInfo,name)
137 COM_Invoke_(pdsp,name,typ0="",prm0="",typ1="",prm1="",typ2="",prm2="",typ3="",prm3="",typ4="",prm4="",typ5="",prm5="",typ6="",prm6="",typ7="",prm7="",typ8="",prm8="",typ9="",prm9="")
141 SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . ".", COM_AddRef(pdsp)
149 Else If name not contains [,(
151 Else If InStr("])",SubStr(name,0))
152 Loop, Parse, name, [(,'")]
155 Else prmn := A_LoopField
158 name .= "." . A_LoopField
162 pdsp:= COM_Invoke(pdsp,name,prmn!="" ? prmn:"vT_NoNe")+COM_Release(pdsp)*0,name:=A_LoopField
163 Else Return COM_Invoke_(pdsp,name,typ0,prm0,typ1,prm1,typ2,prm2,typ3,prm3,typ4,prm4,typ5,prm5,typ6,prm6,typ7,prm7,typ8,prm8,typ9,prm9),COM_Release(pdsp)
166 sParams := "0123456789"
168 If (typ%A_LoopField% = "")
170 sParams := SubStr(sParams,1,A_Index-1)
173 VarSetCapacity(varg,16*nParams:=StrLen(sParams),0), VarSetCapacity(DispParams,16,0), VarSetCapacity(varResult,32,0), VarSetCapacity(ExcepInfo,32,0)
175 NumPut(typ%A_LoopField%,varg,(nParams-A_Index)*16,"Ushort"),typ%A_LoopField%&0x4000=0 ? NumPut(typ%A_LoopField%=8 ? COM_SysAllocString(prm%A_LoopField%):prm%A_LoopField%,varg,(nParams-A_Index)*16+8,typ%A_LoopField%=5||typ%A_LoopField%=7 ? "double":typ%A_LoopField%=4 ? "float":"int64"):typ%A_LoopField%=0x400C||typ%A_LoopField%=0x400E ? NumPut(prm%A_LoopField%,varg,(nParams-A_Index)*16+8):(VarSetCapacity(_ref_%A_LoopField%,8,0),NumPut(&_ref_%A_LoopField%,varg,(nParams-A_Index)*16+8),NumPut((prmx:=prm%A_LoopField%)&&typ%A_LoopField%=0x4008 ? COM_SysAllocString(%prmx%):%prmx%,_ref_%A_LoopField%,0,typ%A_LoopField%=0x4005||typ%A_LoopField%=0x4007 ? "double":typ%A_LoopField%=0x4004 ? "float":"int64"))
177 NumPut(nParams,NumPut(&varg,DispParams),4)
178 If (nvk := SubStr(name,0)="=" ? 12:3)=12
179 name := SubStr(name,1,-1),NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)
180 Global COM_HR, COM_LR:=""
181 If (COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+20),"Uint",pdsp,"Uint",&varResult+16,"UintP",COM_Unicode4Ansi(wname,name),"Uint",1,"Uint",LCID,"intP",dispID,"Uint"))=0&&(COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",nvk,"Uint",&DispParams,"Uint",&varResult,"Uint",&ExcepInfo,"Uint",0,"Uint"))!=0&&nParams&&nvk!=12&&(COM_LR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",12,"Uint",NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)-16,"Uint",0,"Uint",0,"Uint",0,"Uint"))=0
184 typ%A_LoopField%&0x4000=0 ? (typ%A_LoopField%=8 ? COM_SysFreeString(NumGet(varg,(nParams-A_Index)*16+8)):""):typ%A_LoopField%=0x400C||typ%A_LoopField%=0x400E ? "":(prmx:=prm%A_LoopField%,%prmx%:=typ%A_LoopField%=0x4008 ? COM_Ansi4Unicode(prmx:=NumGet(_ref_%A_LoopField%)) . COM_SysFreeString(prmx):NumGet(_ref_%A_LoopField%,0,typ%A_LoopField%=0x4005||typ%A_LoopField%=0x4007 ? "double":typ%A_LoopField%=0x4004 ? "float":"int64"))
185 Global COM_VT := NumGet(varResult,0,"Ushort")
186 Return COM_HR=0 ? COM_VT>1 ? COM_VT=8||COM_VT<0x1000&&DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",1,"Ushort",8)=0 ? COM_Ansi4Unicode(bstr:=NumGet(varResult,8)) . COM_SysFreeString(bstr):NumGet(varResult,8):"":COM_Error(COM_HR,COM_LR,&ExcepInfo,name)
189 COM_DispInterface(this, prm1="", prm2="", prm3="", prm4="", prm5="", prm6="", prm7="", prm8="")
193 hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+28),"Uint",p,"Uint",prm1,"UintP",pname,"Uint",1,"UintP",0), hr==0 ? (VarSetCapacity(sfn,63),DllCall("user32\wsprintfA","str",sfn,"str","%s%S","Uint",this+40,"Uint",pname,"Cdecl"),COM_SysFreeString(pname),%sfn%(prm5,this,prm6)):""
194 Else If A_EventInfo = 5
195 hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+40),"Uint",p,"Uint",prm2,"Uint",prm3,"Uint",prm5)
196 Else If A_EventInfo = 4
197 NumPut(0*hr:=0x80004001,prm3+0)
198 Else If A_EventInfo = 3
200 Else If A_EventInfo = 2
201 NumPut(hr:=NumGet(this+4)-1,this+4)
202 Else If A_EventInfo = 1
203 NumPut(hr:=NumGet(this+4)+1,this+4)
204 Else If A_EventInfo = 0
205 COM_IsEqualGUID(this+24,prm1)||InStr("{00020400-0000-0000-C000-000000000046}{00000000-0000-0000-C000-000000000046}",COM_String4GUID(prm1)) ? NumPut(NumPut(NumGet(this+4)+1,this+4)-8,prm2+0):NumPut(0*hr:=0x80004002,prm2+0)
209 COM_DispGetParam(pDispParams, Position = 0, vt = 8)
211 VarSetCapacity(varResult,16,0)
212 DllCall("oleaut32\DispGetParam", "Uint", pDispParams, "Uint", Position, "Ushort", vt, "Uint", &varResult, "UintP", nArgErr)
213 Return NumGet(varResult,0,"Ushort")=8 ? COM_Ansi4Unicode(NumGet(varResult,8)) . COM_SysFreeString(NumGet(varResult,8)) : NumGet(varResult,8)
216 COM_DispSetParam(val, pDispParams, Position = 0, vt = 8)
218 Return NumPut(vt=8 ? COM_SysAllocString(val) : val,NumGet(NumGet(pDispParams+0)+(NumGet(pDispParams+8)-Position)*16-8),0,vt=11||vt=2 ? "short" : "int")
221 COM_Error(hr = "", lr = "", pei = "", name = "")
227 Global COM_HR, COM_LR
228 Return COM_HR&&COM_LR ? COM_LR<<32|COM_HR:COM_HR
232 hr ? (VarSetCapacity(sError,1023),VarSetCapacity(nError,10),DllCall("kernel32\FormatMessageA","Uint",0x1000,"Uint",0,"Uint",hr<>0x80020009 ? hr : (bExcep:=1)*(hr:=NumGet(pei+28)) ? hr : hr:=NumGet(pei+0,0,"Ushort")+0x80040200,"Uint",0,"str",sError,"Uint",1024,"Uint",0),DllCall("user32\wsprintfA","str",nError,"str","0x%08X","Uint",hr,"Cdecl")) : sError:="The COM Object may not be a valid Dispatch Object!`n`tFirst ensure that COM Library has been initialized through COM_Init().`n", lr ? (VarSetCapacity(sError2,1023),VarSetCapacity(nError2,10),DllCall("kernel32\FormatMessageA","Uint",0x1000,"Uint",0,"Uint",lr,"Uint",0,"str",sError2,"Uint",1024,"Uint",0),DllCall("user32\wsprintfA","str",nError2,"str","0x%08X","Uint",lr,"Cdecl")) : ""
233 MsgBox, 260, COM Error Notification, % "Function Name:`t""" . name . """`nERROR:`t" . sError . "`t(" . nError . ")" . (bExcep ? SubStr(NumGet(pei+24) ? DllCall(NumGet(pei+24),"Uint",pei) : "",1,0) . "`nPROG:`t" . COM_Ansi4Unicode(NumGet(pei+4)) . COM_SysFreeString(NumGet(pei+4)) . "`nDESC:`t" . COM_Ansi4Unicode(NumGet(pei+8)) . COM_SysFreeString(NumGet(pei+8)) . "`nHELP:`t" . COM_Ansi4Unicode(NumGet(pei+12)) . COM_SysFreeString(NumGet(pei+12)) . "," . NumGet(pei+16) : "") . (lr ? "`n`nERROR2:`t" . sError2 . "`t(" . nError2 . ")" : "") . "`n`nWill Continue?"
237 COM_CreateIDispatch()
240 If Not VarSetCapacity(IDispatch)
242 VarSetCapacity(IDispatch,28,0), nParams=3112469
244 NumPut(RegisterCallback("COM_DispInterface","",A_LoopField,A_Index-1),IDispatch,4*(A_Index-1))
249 COM_GetDefaultInterface(pdisp, LCID = 0)
251 DllCall(NumGet(NumGet(1*pdisp) +12), "Uint", pdisp , "UintP", ctinf)
254 DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", LCID, "UintP", ptinf)
255 DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
256 DllCall(NumGet(NumGet(1*pdisp)+ 0), "Uint", pdisp, "Uint" , pattr, "UintP", ppv)
257 DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
258 DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
260 DllCall(NumGet(NumGet(1*pdisp)+ 8), "Uint", pdisp), pdisp := ppv
265 COM_GetDefaultEvents(pdisp, LCID = 0)
267 DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", LCID, "UintP", ptinf)
268 DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
269 VarSetCapacity(IID,16), DllCall("RtlMoveMemory", "Uint", &IID, "Uint", pattr, "Uint", 16)
270 DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
271 DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
272 DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
273 Loop, % DllCall(NumGet(NumGet(1*ptlib)+12), "Uint", ptlib)
275 DllCall(NumGet(NumGet(1*ptlib)+20), "Uint", ptlib, "Uint", A_Index-1, "UintP", TKind)
278 DllCall(NumGet(NumGet(1*ptlib)+16), "Uint", ptlib, "Uint", A_Index-1, "UintP", ptinf)
279 DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
280 nCount:=NumGet(pattr+48,0,"Ushort")
281 DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
284 DllCall(NumGet(NumGet(1*ptinf)+36), "Uint", ptinf, "Uint", A_Index-1, "UintP", nFlags)
287 DllCall(NumGet(NumGet(1*ptinf)+32), "Uint", ptinf, "Uint", A_Index-1, "UintP", hRefType)
288 DllCall(NumGet(NumGet(1*ptinf)+56), "Uint", ptinf, "Uint", hRefType , "UintP", prinf)
289 DllCall(NumGet(NumGet(1*prinf)+12), "Uint", prinf, "UintP", pattr)
290 nFlags & 2 ? DIID:=COM_String4GUID(pattr) : bFind:=COM_IsEqualGUID(pattr,&IID)
291 DllCall(NumGet(NumGet(1*prinf)+76), "Uint", prinf, "Uint" , pattr)
292 DllCall(NumGet(NumGet(1*prinf)+ 8), "Uint", prinf)
294 DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
298 DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
299 Return bFind ? DIID : "{00000000-0000-0000-0000-000000000000}"
302 COM_GetGuidOfName(pdisp, Name, LCID = 0)
304 DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", LCID, "UintP", ptinf)
305 DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
306 DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf:=0
307 DllCall(NumGet(NumGet(1*ptlib)+44), "Uint", ptlib, "Uint", COM_Unicode4Ansi(Name,Name), "Uint", 0, "UintP", ptinf, "UintP", memID, "UshortP", 1)
308 DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
309 DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
310 GUID := COM_String4GUID(pattr)
311 DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
312 DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
316 COM_GetTypeInfoOfGuid(pdisp, GUID, LCID = 0)
318 DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", LCID, "UintP", ptinf)
319 DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)
320 DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf := 0
321 DllCall(NumGet(NumGet(1*ptlib)+24), "Uint", ptlib, "Uint", COM_GUID4String(GUID,GUID), "UintP", ptinf)
322 DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
326 ; A Function Name including Prefix is limited to 63 bytes!
327 COM_ConnectObject(psource, prefix = "", DIID = "")
330 0+(pconn:=COM_FindConnectionPoint(psource,"{00020400-0000-0000-C000-000000000046}")) ? (DIID:=COM_GetConnectionInterface(pconn))="{00020400-0000-0000-C000-000000000046}" ? DIID:=COM_GetDefaultEvents(psource) : "" : pconn:=COM_FindConnectionPoint(psource,DIID:=COM_GetDefaultEvents(psource))
331 Else pconn:=COM_FindConnectionPoint(psource,SubStr(DIID,1,1)="{" ? DIID : DIID:=COM_GetGuidOfName(psource,DIID))
332 If !pconn || !ptinf:=COM_GetTypeInfoOfGuid(psource,DIID)
334 MsgBox, No Event Interface Exists!
337 psink:=COM_CoTaskMemAlloc(40+StrLen(prefix)+1), NumPut(1,NumPut(COM_CreateIDispatch(),psink+0)), NumPut(psource,NumPut(ptinf,psink+8))
338 DllCall("RtlMoveMemory", "Uint", psink+24, "Uint", COM_GUID4String(DIID,DIID), "Uint", 16)
339 DllCall("RtlMoveMemory", "Uint", psink+40, "Uint", &prefix, "Uint", StrLen(prefix)+1)
340 NumPut(COM_Advise(pconn,psink),NumPut(pconn,psink+16))
344 COM_DisconnectObject(psink)
346 Return COM_Unadvise(NumGet(psink+16),NumGet(psink+20))=0 ? (0,COM_Release(NumGet(psink+16)),COM_Release(NumGet(psink+8)),COM_CoTaskMemFree(psink)) : 1
349 COM_CreateObject(CLSID, IID = "", CLSCTX = 5)
351 DllCall("ole32\CoCreateInstance", "Uint", SubStr(CLSID,1,1)="{" ? COM_GUID4String(CLSID,CLSID) : COM_CLSID4ProgID(CLSID,CLSID), "Uint", 0, "Uint", CLSCTX, "Uint", COM_GUID4String(IID,IID ? IID : IID=0 ? "{00000000-0000-0000-C000-000000000046}" : "{00020400-0000-0000-C000-000000000046}"), "UintP", ppv)
355 COM_ActiveXObject(ProgID)
357 DllCall("ole32\CoCreateInstance", "Uint", SubStr(ProgID,1,1)="{" ? COM_GUID4String(ProgID,ProgID) : COM_CLSID4ProgID(ProgID,ProgID), "Uint", 0, "Uint", 5, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)
358 Return COM_GetDefaultInterface(pdisp)
361 COM_GetObject(Moniker)
363 DllCall("ole32\CoGetObject", "Uint", COM_Unicode4Ansi(Moniker,Moniker), "Uint", 0, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)
364 Return COM_GetDefaultInterface(pdisp)
367 COM_GetActiveObject(ProgID)
369 DllCall("oleaut32\GetActiveObject", "Uint", SubStr(ProgID,1,1)="{" ? COM_GUID4String(ProgID,ProgID) : COM_CLSID4ProgID(ProgID,ProgID), "Uint", 0, "UintP", punk)
370 DllCall(NumGet(NumGet(1*punk)+0), "Uint", punk, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)
371 DllCall(NumGet(NumGet(1*punk)+8), "Uint", punk)
372 Return COM_GetDefaultInterface(pdisp)
375 COM_CLSID4ProgID(ByRef CLSID, ProgID)
377 VarSetCapacity(CLSID, 16)
378 DllCall("ole32\CLSIDFromProgID", "Uint", COM_Unicode4Ansi(ProgID,ProgID), "Uint", &CLSID)
382 COM_GUID4String(ByRef CLSID, String)
384 VarSetCapacity(CLSID, 16)
385 DllCall("ole32\CLSIDFromString", "Uint", COM_Unicode4Ansi(String,String,38), "Uint", &CLSID)
389 COM_ProgID4CLSID(pCLSID)
391 DllCall("ole32\ProgIDFromCLSID", "Uint", pCLSID, "UintP", pProgID)
392 Return COM_Ansi4Unicode(pProgID) . COM_CoTaskMemFree(pProgID)
395 COM_String4GUID(pGUID)
397 VarSetCapacity(String, 38 * 2 + 1)
398 DllCall("ole32\StringFromGUID2", "Uint", pGUID, "Uint", &String, "int", 39)
399 Return COM_Ansi4Unicode(&String, 38)
402 COM_IsEqualGUID(pGUID1, pGUID2)
404 Return DllCall("ole32\IsEqualGUID", "Uint", pGUID1, "Uint", pGUID2)
409 VarSetCapacity(GUID, 16, 0)
410 DllCall("ole32\CoCreateGuid", "Uint", &GUID)
411 Return COM_String4GUID(&GUID)
414 COM_CoTaskMemAlloc(cb)
416 Return DllCall("ole32\CoTaskMemAlloc", "Uint", cb)
419 COM_CoTaskMemFree(pv)
421 DllCall("ole32\CoTaskMemFree", "Uint", pv)
426 Return DllCall("ole32\CoInitialize", "Uint", 0)
431 DllCall("ole32\CoUninitialize")
434 COM_SysAllocString(sString)
436 Return DllCall("oleaut32\SysAllocString", "Uint", COM_Ansi2Unicode(sString,wString))
439 COM_SysFreeString(bstr)
441 DllCall("oleaut32\SysFreeString", "Uint", bstr)
444 COM_SysStringLen(bstr)
446 Return DllCall("oleaut32\SysStringLen", "Uint", bstr)
449 COM_SafeArrayDestroy(psa)
451 Return DllCall("oleaut32\SafeArrayDestroy", "Uint", psa)
454 COM_VariantClear(pvarg)
456 Return DllCall("oleaut32\VariantClear", "Uint", pvarg)
462 If Not DllCall("GetModuleHandle", "str", "oleacc")
463 Return DllCall("LoadLibrary", "str", "oleacc")
469 If h:= DllCall("GetModuleHandle", "str", "oleacc")
470 Return DllCall("FreeLibrary", "Uint", h)
473 COM_AccessibleChildren(pacc, cChildren, ByRef varChildren)
475 VarSetCapacity(varChildren,cChildren*16,0)
476 If DllCall("oleacc\AccessibleChildren", "Uint", pacc, "Uint", 0, "Uint", cChildren+0, "Uint", &varChildren, "UintP", cChildren:=0)=0
480 COM_AccessibleObjectFromEvent(hWnd, idObject, idChild, ByRef _idChild_="")
482 VarSetCapacity(varChild,16,0)
483 If DllCall("oleacc\AccessibleObjectFromEvent", "Uint", hWnd, "Uint", idObject, "Uint", idChild, "UintP", pacc, "Uint", &varChild)=0
484 Return pacc, _idChild_:=NumGet(varChild,8)
487 COM_AccessibleObjectFromPoint(x, y, ByRef _idChild_="")
489 VarSetCapacity(varChild,16,0)
490 If DllCall("oleacc\AccessibleObjectFromPoint", "int", x, "int", y, "UintP", pacc, "Uint", &varChild)=0
491 Return pacc, _idChild_:=NumGet(varChild,8)
494 COM_AccessibleObjectFromWindow(hWnd, idObject=-4, IID = "")
496 If DllCall("oleacc\AccessibleObjectFromWindow", "Uint", hWnd, "Uint", idObject, "Uint", COM_GUID4String(IID, IID ? IID : idObject&0xFFFFFFFF==0xFFFFFFF0 ? "{00020400-0000-0000-C000-000000000046}":"{618736E0-3C3D-11CF-810C-00AA00389B71}"), "UintP", pacc)=0
500 COM_WindowFromAccessibleObject(pacc)
502 If DllCall("oleacc\WindowFromAccessibleObject", "Uint", pacc, "UintP", hWnd)=0
506 COM_GetRoleText(nRole)
508 nSize:= DllCall("oleacc\GetRoleTextA", "Uint", nRole, "Uint", 0, "Uint", 0)
509 VarSetCapacity(sRole,nSize)
510 If DllCall("oleacc\GetRoleTextA", "Uint", nRole, "str", sRole, "Uint", nSize+1)
514 COM_GetStateText(nState)
516 nSize:= DllCall("oleacc\GetStateTextA", "Uint", nState, "Uint", 0, "Uint", 0)
517 VarSetCapacity(sState,nSize)
518 If DllCall("oleacc\GetStateTextA", "Uint", nState, "str", sState, "Uint", nSize+1)
522 COM_AtlAxWinInit(Version = "")
525 If Not DllCall("GetModuleHandle", "str", "atl" . Version)
526 DllCall("LoadLibrary", "str", "atl" . Version)
527 Return DllCall("atl" . Version . "\AtlAxWinInit")
530 COM_AtlAxWinTerm(Version = "")
533 If h:= DllCall("GetModuleHandle", "str", "atl" . Version)
534 Return DllCall("FreeLibrary", "Uint", h)
537 COM_AtlAxAttachControl(pdsp, hWnd, Version = "")
539 Return DllCall("atl" . Version . "\AtlAxAttachControl", "Uint", punk:=COM_QueryInterface(pdsp,0), "Uint", hWnd, "Uint", 0), COM_Release(punk)
542 COM_AtlAxCreateControl(hWnd, Name, Version = "")
544 If DllCall("atl" . Version . "\AtlAxCreateControl", "Uint", COM_Unicode4Ansi(Name,Name), "Uint", hWnd, "Uint", 0, "Uint", 0)=0
545 Return COM_AtlAxGetControl(hWnd, Version)
548 COM_AtlAxGetControl(hWnd, Version = "")
550 If DllCall("atl" . Version . "\AtlAxGetControl", "Uint", hWnd, "UintP", punk)=0
551 pdsp:=COM_QueryInterface(punk), COM_Release(punk)
555 COM_AtlAxGetHost(hWnd, Version = "")
557 If DllCall("atl" . Version . "\AtlAxGetHost", "Uint", hWnd, "UintP", punk)=0
558 pdsp:=COM_QueryInterface(punk), COM_Release(punk)
562 COM_AtlAxCreateContainer(hWnd, l, t, w, h, Name = "", Version = "")
564 Return DllCall("CreateWindowEx", "Uint",0x200, "str", "AtlAxWin" . Version, "Uint", Name ? &Name : 0, "Uint", 0x54000000, "int", l, "int", t, "int", w, "int", h, "Uint", hWnd, "Uint", 0, "Uint", 0, "Uint", 0)
567 COM_AtlAxGetContainer(pdsp, bCtrl = "")
569 DllCall(NumGet(NumGet(1*pdsp)+ 0), "Uint", pdsp, "Uint", COM_GUID4String(IID_IOleWindow,"{00000114-0000-0000-C000-000000000046}"), "UintP", pwin)
570 DllCall(NumGet(NumGet(1*pwin)+12), "Uint", pwin, "UintP", hCtrl)
571 DllCall(NumGet(NumGet(1*pwin)+ 8), "Uint", pwin)
572 Return bCtrl ? hCtrl : DllCall("GetParent", "Uint", hCtrl)
575 COM_Ansi4Unicode(pString, nSize = "")
578 nSize:=DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0)
579 VarSetCapacity(sString, nSize)
580 DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize + 1, "Uint", 0, "Uint", 0)
584 COM_Unicode4Ansi(ByRef wString, sString, nSize = "")
587 nSize:=DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
588 VarSetCapacity(wString, nSize * 2 + 1)
589 DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize + 1)
593 COM_Ansi2Unicode(ByRef sString, ByRef wString, nSize = "")
596 nSize:=DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
597 VarSetCapacity(wString, nSize * 2 + 1)
598 DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize + 1)
602 COM_Unicode2Ansi(ByRef wString, ByRef sString, nSize = "")
604 pString := wString + 0 > 65535 ? wString : &wString
606 nSize:=DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0)
607 VarSetCapacity(sString, nSize)
608 DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize + 1, "Uint", 0, "Uint", 0)
612 COM_ScriptControl(sCode, sLang = "", bEval = False, sFunc = "", sName = "", pdisp = 0, bGlobal = False)
615 psc := COM_CreateObject("MSScriptControl.ScriptControl")
616 COM_Invoke(psc, "Language", sLang ? sLang : "VBScript")
617 sName ? COM_Invoke(psc, "AddObject", sName, "+" . pdisp, bGlobal) : ""
618 sFunc ? COM_Invoke(psc, "AddCode", sCode) : ""
619 ret := COM_Invoke(psc, bEval ? "Eval" : "ExecuteStatement", sFunc ? sFunc : sCode)