]> Tony Duckles's Git Repositories (git.nynim.org) - autohotkey-scripts.git/blob - Lib/COM.ahk
Init AutoHotKey
[autohotkey-scripts.git] / Lib / COM.ahk
1 ;------------------------------------------------------------------------------
2 ; COM.ahk Standard Library
3 ; by Sean
4 ; http://www.autohotkey.com/forum/topic22923.html
5 ;------------------------------------------------------------------------------
6
7 COM_Init()
8 {
9 Return DllCall("ole32\OleInitialize", "Uint", 0)
10 }
11
12 COM_Term()
13 {
14 Return DllCall("ole32\OleUninitialize")
15 }
16
17 COM_VTable(ppv, idx)
18 {
19 Return NumGet(NumGet(1*ppv)+4*idx)
20 }
21
22 COM_QueryInterface(ppv, IID = "")
23 {
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
25 Return ppv
26 }
27
28 COM_AddRef(ppv)
29 {
30 Return DllCall(NumGet(NumGet(1*ppv)+4), "Uint", ppv)
31 }
32
33 COM_Release(ppv)
34 {
35 Return DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv)
36 }
37
38 COM_QueryService(ppv, SID, IID = "")
39 {
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)
43 Return ppv
44 }
45
46 COM_FindConnectionPoint(pdp, DIID)
47 {
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)
51 Return pcp
52 }
53
54 COM_GetConnectionInterface(pcp)
55 {
56 VarSetCapacity(DIID, 16, 0)
57 DllCall(NumGet(NumGet(1*pcp)+12), "Uint", pcp, "Uint", &DIID)
58 Return COM_String4GUID(&DIID)
59 }
60
61 COM_Advise(pcp, psink)
62 {
63 DllCall(NumGet(NumGet(1*pcp)+20), "Uint", pcp, "Uint", psink, "UintP", nCookie)
64 Return nCookie
65 }
66
67 COM_Unadvise(pcp, nCookie)
68 {
69 Return DllCall(NumGet(NumGet(1*pcp)+24), "Uint", pcp, "Uint", nCookie)
70 }
71
72 COM_Enumerate(penum, ByRef Result, ByRef vt = "")
73 {
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)
77 Return hr
78 }
79
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")
81 {
82 If name=
83 Return COM_Release(pdsp)
84 If name contains .
85 {
86 SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . ".",COM_AddRef(pdsp)
87 Loop, Parse, name, .
88 {
89 If A_Index=1
90 {
91 name := A_LoopField
92 Continue
93 }
94 Else If name not contains [,(
95 prmn := ""
96 Else If InStr("])",SubStr(name,0))
97 Loop, Parse, name, [(,'")]
98 If A_Index=1
99 name := A_LoopField
100 Else prmn := A_LoopField
101 Else
102 {
103 name .= "." . A_LoopField
104 Continue
105 }
106 If 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)
109 }
110 }
111 sParams := "0123456789"
112 Loop, Parse, sParams
113 If (prm%A_LoopField% == "vT_NoNe")
114 {
115 sParams := SubStr(sParams,1,A_Index-1)
116 Break
117 }
118 VarSetCapacity(varg,16*nParams:=StrLen(sParams),0), VarSetCapacity(DispParams,16,0), VarSetCapacity(varResult,32,0), VarSetCapacity(ExcepInfo,32,0)
119 Loop, Parse, sParams
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")
124 If nParams
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
130 COM_HR:=0
131 Loop, % nParams
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)
135 }
136
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="")
138 {
139 If name contains .
140 {
141 SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . ".", COM_AddRef(pdsp)
142 Loop, Parse, name, .
143 {
144 If A_Index=1
145 {
146 name := A_LoopField
147 Continue
148 }
149 Else If name not contains [,(
150 prmn := ""
151 Else If InStr("])",SubStr(name,0))
152 Loop, Parse, name, [(,'")]
153 If A_Index=1
154 name := A_LoopField
155 Else prmn := A_LoopField
156 Else
157 {
158 name .= "." . A_LoopField
159 Continue
160 }
161 If 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)
164 }
165 }
166 sParams := "0123456789"
167 Loop, Parse, sParams
168 If (typ%A_LoopField% = "")
169 {
170 sParams := SubStr(sParams,1,A_Index-1)
171 Break
172 }
173 VarSetCapacity(varg,16*nParams:=StrLen(sParams),0), VarSetCapacity(DispParams,16,0), VarSetCapacity(varResult,32,0), VarSetCapacity(ExcepInfo,32,0)
174 Loop, Parse, sParams
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"))
176 If nParams
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
182 COM_HR:=0
183 Loop, Parse, sParams
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)
187 }
188
189 COM_DispInterface(this, prm1="", prm2="", prm3="", prm4="", prm5="", prm6="", prm7="", prm8="")
190 {
191 Critical
192 If A_EventInfo = 6
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
199 NumPut(0,prm1+0)
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)
206 Return hr
207 }
208
209 COM_DispGetParam(pDispParams, Position = 0, vt = 8)
210 {
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)
214 }
215
216 COM_DispSetParam(val, pDispParams, Position = 0, vt = 8)
217 {
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")
219 }
220
221 COM_Error(hr = "", lr = "", pei = "", name = "")
222 {
223 Static bDebug:=1
224 If Not pei
225 {
226 bDebug:=hr
227 Global COM_HR, COM_LR
228 Return COM_HR&&COM_LR ? COM_LR<<32|COM_HR:COM_HR
229 }
230 Else If !bDebug
231 Return
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?"
234 IfMsgBox, No, Exit
235 }
236
237 COM_CreateIDispatch()
238 {
239 Static IDispatch
240 If Not VarSetCapacity(IDispatch)
241 {
242 VarSetCapacity(IDispatch,28,0), nParams=3112469
243 Loop, Parse, nParams
244 NumPut(RegisterCallback("COM_DispInterface","",A_LoopField,A_Index-1),IDispatch,4*(A_Index-1))
245 }
246 Return &IDispatch
247 }
248
249 COM_GetDefaultInterface(pdisp, LCID = 0)
250 {
251 DllCall(NumGet(NumGet(1*pdisp) +12), "Uint", pdisp , "UintP", ctinf)
252 If ctinf
253 {
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)
259 If ppv
260 DllCall(NumGet(NumGet(1*pdisp)+ 8), "Uint", pdisp), pdisp := ppv
261 }
262 Return pdisp
263 }
264
265 COM_GetDefaultEvents(pdisp, LCID = 0)
266 {
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)
274 {
275 DllCall(NumGet(NumGet(1*ptlib)+20), "Uint", ptlib, "Uint", A_Index-1, "UintP", TKind)
276 If TKind <> 5
277 Continue
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)
282 Loop, % nCount
283 {
284 DllCall(NumGet(NumGet(1*ptinf)+36), "Uint", ptinf, "Uint", A_Index-1, "UintP", nFlags)
285 If !(nFlags & 1)
286 Continue
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)
293 }
294 DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
295 If bFind
296 Break
297 }
298 DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)
299 Return bFind ? DIID : "{00000000-0000-0000-0000-000000000000}"
300 }
301
302 COM_GetGuidOfName(pdisp, Name, LCID = 0)
303 {
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)
313 Return GUID
314 }
315
316 COM_GetTypeInfoOfGuid(pdisp, GUID, LCID = 0)
317 {
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)
323 Return ptinf
324 }
325
326 ; A Function Name including Prefix is limited to 63 bytes!
327 COM_ConnectObject(psource, prefix = "", DIID = "")
328 {
329 If Not 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)
333 {
334 MsgBox, No Event Interface Exists!
335 Return
336 }
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))
341 Return psink
342 }
343
344 COM_DisconnectObject(psink)
345 {
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
347 }
348
349 COM_CreateObject(CLSID, IID = "", CLSCTX = 5)
350 {
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)
352 Return ppv
353 }
354
355 COM_ActiveXObject(ProgID)
356 {
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)
359 }
360
361 COM_GetObject(Moniker)
362 {
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)
365 }
366
367 COM_GetActiveObject(ProgID)
368 {
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)
373 }
374
375 COM_CLSID4ProgID(ByRef CLSID, ProgID)
376 {
377 VarSetCapacity(CLSID, 16)
378 DllCall("ole32\CLSIDFromProgID", "Uint", COM_Unicode4Ansi(ProgID,ProgID), "Uint", &CLSID)
379 Return &CLSID
380 }
381
382 COM_GUID4String(ByRef CLSID, String)
383 {
384 VarSetCapacity(CLSID, 16)
385 DllCall("ole32\CLSIDFromString", "Uint", COM_Unicode4Ansi(String,String,38), "Uint", &CLSID)
386 Return &CLSID
387 }
388
389 COM_ProgID4CLSID(pCLSID)
390 {
391 DllCall("ole32\ProgIDFromCLSID", "Uint", pCLSID, "UintP", pProgID)
392 Return COM_Ansi4Unicode(pProgID) . COM_CoTaskMemFree(pProgID)
393 }
394
395 COM_String4GUID(pGUID)
396 {
397 VarSetCapacity(String, 38 * 2 + 1)
398 DllCall("ole32\StringFromGUID2", "Uint", pGUID, "Uint", &String, "int", 39)
399 Return COM_Ansi4Unicode(&String, 38)
400 }
401
402 COM_IsEqualGUID(pGUID1, pGUID2)
403 {
404 Return DllCall("ole32\IsEqualGUID", "Uint", pGUID1, "Uint", pGUID2)
405 }
406
407 COM_CoCreateGuid()
408 {
409 VarSetCapacity(GUID, 16, 0)
410 DllCall("ole32\CoCreateGuid", "Uint", &GUID)
411 Return COM_String4GUID(&GUID)
412 }
413
414 COM_CoTaskMemAlloc(cb)
415 {
416 Return DllCall("ole32\CoTaskMemAlloc", "Uint", cb)
417 }
418
419 COM_CoTaskMemFree(pv)
420 {
421 DllCall("ole32\CoTaskMemFree", "Uint", pv)
422 }
423
424 COM_CoInitialize()
425 {
426 Return DllCall("ole32\CoInitialize", "Uint", 0)
427 }
428
429 COM_CoUninitialize()
430 {
431 DllCall("ole32\CoUninitialize")
432 }
433
434 COM_SysAllocString(sString)
435 {
436 Return DllCall("oleaut32\SysAllocString", "Uint", COM_Ansi2Unicode(sString,wString))
437 }
438
439 COM_SysFreeString(bstr)
440 {
441 DllCall("oleaut32\SysFreeString", "Uint", bstr)
442 }
443
444 COM_SysStringLen(bstr)
445 {
446 Return DllCall("oleaut32\SysStringLen", "Uint", bstr)
447 }
448
449 COM_SafeArrayDestroy(psa)
450 {
451 Return DllCall("oleaut32\SafeArrayDestroy", "Uint", psa)
452 }
453
454 COM_VariantClear(pvarg)
455 {
456 Return DllCall("oleaut32\VariantClear", "Uint", pvarg)
457 }
458
459 COM_AccInit()
460 {
461 COM_Init()
462 If Not DllCall("GetModuleHandle", "str", "oleacc")
463 Return DllCall("LoadLibrary", "str", "oleacc")
464 }
465
466 COM_AccTerm()
467 {
468 COM_Term()
469 If h:= DllCall("GetModuleHandle", "str", "oleacc")
470 Return DllCall("FreeLibrary", "Uint", h)
471 }
472
473 COM_AccessibleChildren(pacc, cChildren, ByRef varChildren)
474 {
475 VarSetCapacity(varChildren,cChildren*16,0)
476 If DllCall("oleacc\AccessibleChildren", "Uint", pacc, "Uint", 0, "Uint", cChildren+0, "Uint", &varChildren, "UintP", cChildren:=0)=0
477 Return cChildren
478 }
479
480 COM_AccessibleObjectFromEvent(hWnd, idObject, idChild, ByRef _idChild_="")
481 {
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)
485 }
486
487 COM_AccessibleObjectFromPoint(x, y, ByRef _idChild_="")
488 {
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)
492 }
493
494 COM_AccessibleObjectFromWindow(hWnd, idObject=-4, IID = "")
495 {
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
497 Return pacc
498 }
499
500 COM_WindowFromAccessibleObject(pacc)
501 {
502 If DllCall("oleacc\WindowFromAccessibleObject", "Uint", pacc, "UintP", hWnd)=0
503 Return hWnd
504 }
505
506 COM_GetRoleText(nRole)
507 {
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)
511 Return sRole
512 }
513
514 COM_GetStateText(nState)
515 {
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)
519 Return sState
520 }
521
522 COM_AtlAxWinInit(Version = "")
523 {
524 COM_Init()
525 If Not DllCall("GetModuleHandle", "str", "atl" . Version)
526 DllCall("LoadLibrary", "str", "atl" . Version)
527 Return DllCall("atl" . Version . "\AtlAxWinInit")
528 }
529
530 COM_AtlAxWinTerm(Version = "")
531 {
532 COM_Term()
533 If h:= DllCall("GetModuleHandle", "str", "atl" . Version)
534 Return DllCall("FreeLibrary", "Uint", h)
535 }
536
537 COM_AtlAxAttachControl(pdsp, hWnd, Version = "")
538 {
539 Return DllCall("atl" . Version . "\AtlAxAttachControl", "Uint", punk:=COM_QueryInterface(pdsp,0), "Uint", hWnd, "Uint", 0), COM_Release(punk)
540 }
541
542 COM_AtlAxCreateControl(hWnd, Name, Version = "")
543 {
544 If DllCall("atl" . Version . "\AtlAxCreateControl", "Uint", COM_Unicode4Ansi(Name,Name), "Uint", hWnd, "Uint", 0, "Uint", 0)=0
545 Return COM_AtlAxGetControl(hWnd, Version)
546 }
547
548 COM_AtlAxGetControl(hWnd, Version = "")
549 {
550 If DllCall("atl" . Version . "\AtlAxGetControl", "Uint", hWnd, "UintP", punk)=0
551 pdsp:=COM_QueryInterface(punk), COM_Release(punk)
552 Return pdsp
553 }
554
555 COM_AtlAxGetHost(hWnd, Version = "")
556 {
557 If DllCall("atl" . Version . "\AtlAxGetHost", "Uint", hWnd, "UintP", punk)=0
558 pdsp:=COM_QueryInterface(punk), COM_Release(punk)
559 Return pdsp
560 }
561
562 COM_AtlAxCreateContainer(hWnd, l, t, w, h, Name = "", Version = "")
563 {
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)
565 }
566
567 COM_AtlAxGetContainer(pdsp, bCtrl = "")
568 {
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)
573 }
574
575 COM_Ansi4Unicode(pString, nSize = "")
576 {
577 If (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)
581 Return sString
582 }
583
584 COM_Unicode4Ansi(ByRef wString, sString, nSize = "")
585 {
586 If (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)
590 Return &wString
591 }
592
593 COM_Ansi2Unicode(ByRef sString, ByRef wString, nSize = "")
594 {
595 If (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)
599 Return &wString
600 }
601
602 COM_Unicode2Ansi(ByRef wString, ByRef sString, nSize = "")
603 {
604 pString := wString + 0 > 65535 ? wString : &wString
605 If (nSize = "")
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)
609 Return &sString
610 }
611
612 COM_ScriptControl(sCode, sLang = "", bEval = False, sFunc = "", sName = "", pdisp = 0, bGlobal = False)
613 {
614 COM_Init()
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)
620 COM_Release(psc)
621 COM_Term()
622 Return ret
623 }