[*:2uwlkwop]
COM Object: Ahk.ComSurrogate.32/64
[*:2uwlkwop]
Purpose: Create COM objects of a specified bitness
[*:2uwlkwop]
System Requirements: ComDispatch.ahk (with the included ComRemote.ahk library)
[*:2uwlkwop]
Description:This is a simple COM script that proxies the creation of 32-bit only objects on 64-bit scripts and viceversa.
;
; File encoding: UTF-8
; Author: fincs
;
; COM 32bit<->64bit object creation surrogate
;
[color=#107095]#NoEnv[/color]
[color=#107095]SendMode[/color] [color=#107095]Input[/color]
[color=#107095]SetWorkingDir[/color], %[color=brown]A_ScriptDir[/color]%
[color=#107095]#Persistent[/color]
;#NoTrayIcon
[color=#107095]#SingleInstance[/color] Off
[color=#107095]#Include[/color] ComRemote.ahk
; CLSID and APPID for this script: don't reuse, please!
[color=#107095]if[/color] [color=brown]A_PtrSize[/color] = 4
{
CLSID_ThisScript := [color=#666666]"{EB42F5B6-31A0-4B9D-8C6D-757FE4136B2C}"[/color]
APPID_ThisScript := [color=#666666]"Ahk.ComSurrogate.32"[/color]
}[color=#107095]else[/color] [color=#107095]if[/color] [color=brown]A_PtrSize[/color] = 8
{
CLSID_ThisScript := [color=#666666]"{CC2D93BB-3818-40E6-9405-804512FF23DC}"[/color]
APPID_ThisScript := [color=#666666]"Ahk.ComSurrogate.64"[/color]
}[color=#107095]else[/color]
{
[color=#107095]MsgBox[/color], 16,, What kind of weird AHK build are you running?!
[color=#107095]ExitApp[/color]
}
[color=#107095]ComObjError[/color](false)
test := [color=#107095]ComObjActive[/color](APPID_ThisScript)
[color=#107095]if[/color] [color=#107095]IsObject[/color](test)
[color=#107095]ExitApp[/color] ; already running
[color=#107095]ComObjError[/color](true)
; Register our CLSID and APPID
[color=#107095]OnExit[/color], IDCleanup
RegisterIDs(CLSID_ThisScript, APPID_ThisScript)
; Create a dispatch object for exposing
myObj := ComDispatch([color=#666666]""[/color], [color=#666666]"ObjCreate=Wrap_ObjCreate, Close=Wrap_Close"[/color])
; Expose it
[color=#107095]if[/color] !(hRemote := ComRemote(myObj, CLSID_ThisScript))
{
[color=#107095]MsgBox[/color], 16, %[color=brown]A_ScriptName[/color]%, Can't remote the [color=#107095]object[/color]!
[color=#107095]ExitApp[/color]
}
; End of auto-run section
[color=#107095]return[/color]
IDCleanup:
; Remove the CLSID and APPID from the registry
RevokeIDs(CLSID_ThisScript, APPID_ThisScript)
[color=#107095]ExitApp[/color]
RegisterIDs(CLSID, APPID)
{
[color=#107095]RegWrite[/color], REG_SZ, HKCU, Software\Classes\%APPID%,, %APPID%
[color=#107095]RegWrite[/color], REG_SZ, HKCU, Software\Classes\%APPID%\CLSID,, %CLSID%
[color=#107095]RegWrite[/color], REG_SZ, HKCU, Software\Classes\CLSID\%CLSID%,, %APPID%
}
RevokeIDs(CLSID, APPID)
{
[color=#107095]RegDelete[/color], HKCU, Software\Classes\%APPID%
[color=#107095]RegDelete[/color], HKCU, Software\Classes\CLSID\%CLSID%
}
Str2GUID(ByRef var, str)
{
[color=#107095]VarSetCapacity[/color](var, 16)
[color=#107095]DllCall[/color]([color=#666666]"ole32\CLSIDFromString"[/color], [color=#666666]"wstr"[/color], str, [color=#666666]"ptr"[/color], &var)
[color=#107095]return[/color] &var
}
; --------------------------------------------
Wrap_ObjCreate(this, ProgIDorCLSID)
{
[color=#107095]return[/color] [color=#107095]ComObjCreate[/color](ProgIDorCLSID)
}
Wrap_Close(this)
{
[color=#107095]Critical[/color]
[color=#107095]SetTimer[/color], _Close, -0
}
_Close:
[color=#107095]ExitApp[/color]
You need to have it running in the background using the AHK_L build of the appropiate bitness (running both AHK_L builds at the same time is supported), then you can use these functions to create objects:
ComCreateObj32(ProgIDorCLSID)
{
[color=#107095]static[/color] _sur := [color=brown]A_PtrSize[/color] = 8 ? [color=#107095]ComObjActive[/color]([color=#666666]"Ahk.ComSurrogate.32"[/color]) : [color=#666666]""[/color]
[color=#107095]return[/color] [color=brown]A_PtrSize[/color] = 8 ? _sur.ObjCreate(ProgIDorCLSID) : [color=#107095]ComObjCreate[/color](ProgIDorCLSID)
}
ComCreateObj64(ProgIDorCLSID)
{
[color=#107095]static[/color] _sur := [color=brown]A_PtrSize[/color] = 4 ? [color=#107095]ComObjActive[/color]([color=#666666]"Ahk.ComSurrogate.64"[/color]) : [color=#666666]""[/color]
[color=#107095]return[/color] [color=brown]A_PtrSize[/color] = 4 ? _sur.ObjCreate(ProgIDorCLSID) : [color=#107095]ComObjCreate[/color](ProgIDorCLSID)
}
Example: ScriptControl on 64-bit AHK_L:
oSC := ComCreateObj32([color=#666666]"ScriptControl"[/color]), oSC.Language := [color=#666666]"VBScript"[/color]
oSC.ExecuteStatement([color=#666666]"MsgBox "[/color][color=#666666]"Hello World!"[/color][color=#666666]""[/color])