Не могу понять как оставить объект действительным при выходе из создающего его процесса, чтобы при следующем запуске подключится к нему по прежнему CLSID.
Вроде как ACTIVEOBJECT_STRONG за это должен отвечать, RevokeActiveObject не используется. Про CoLockObjectExternal примеров не нашёл.
#SingleInstance Force
#NoEnv
; https://www.autohotkey.com/boards/viewtopic.php?t=6148
; https://docs.microsoft.com/ru-ru/windows/win32/api/oleauto/nf-oleauto-registeractiveobject?redirectedfrom=MSDN
; CoLockObjectExternal
If !A_Args[1]
MsgBox % Clipboard := CreateGUID()
try myPublicObj := ComObjActive(Clipboard)
catch
{
MsgBox ComObjActive Error
myPublicObj := {}
ObjRegisterActive(myPublicObj, Clipboard, 0)
}
MsgBox % "Прежнее значение: " myPublicObj.TickCount
MsgBox % "Новое значение: " myPublicObj.TickCount := A_TickCount
Run "%A_ScriptFullPath%" "Reload"
ExitApp
CreateGUID()
{
VarSetCapacity(pguid, 16, 0)
if !DllCall("ole32.dll\CoCreateGuid", Ptr, &pguid) {
size := VarSetCapacity(sguid, (38 << !!A_IsUnicode) + 1, 0)
if DllCall("ole32.dll\StringFromGUID2", Ptr, &pguid, Ptr, &sguid, UInt, size)
return StrGet(&sguid)
}
}
ObjRegisterActive(Object, CLSID = 0, Flags := 0) {
static cookieJar := {}
if !CLSID {
if (( cookie := cookieJar.Delete(Object) ) != "")
DllCall("oleaut32\RevokeActiveObject", UInt, cookie, Ptr, 0)
return
}
if cookieJar[Object]
throw Exception("Object is already registered", -1)
VarSetCapacity(_clsid, 16, 0)
if (hr := DllCall("ole32\CLSIDFromString", WStr, CLSID, Ptr, &_clsid)) < 0
throw Exception("Invalid CLSID", -1, CLSID)
hr := DllCall("oleaut32\RegisterActiveObject", Ptr, &Object, Ptr, &_clsid, UInt, Flags, UIntP, cookie, UInt)
if hr < 0
throw Exception(format("Error 0x{:x}", hr), -1)
cookieJar[Object] := cookie
}
По вопросам возмездной помощи пишите на
E-Mail: serzh82saratov@mail.ru Telegram:
https://t.me/sergiol982Win10x64
AhkSpy,
Hotkey,
ClockGui