Способы сравнения бинарных значений GUID в Autohotkey Topic is solved

Помощь в написании скриптов
vmech
Posts: 374
Joined: 25 Aug 2019, 13:03

Способы сравнения бинарных значений GUID в Autohotkey

Post by vmech » 20 Oct 2023, 17:57

Ок. Спрошу здесь.

Кроме напрашивающегося самим собой способа, например:

Code: Select all

#Requires Autohotkey v2.0
szGUID := 16, Schemes := [], ActiveScheme := Buffer(szGUID)
Loop
{
  r := DllCall('powrprof.dll\PowerEnumerate', 'Ptr', 0, 'Ptr', 0, 'Ptr', 0, 'UInt', 16, 'UInt', A_Index - 1, 'Ptr', GUID := Buffer(szGUID), 'PtrP', &szGUID)
  If r != 0
    Break
  Schemes.Push(GUID)
}

DllCall('powrprof.dll\PowerGetActiveScheme', 'Ptr', 0, 'PtrP', &ptrActive := 0)
NumPut('Int64', NumGet(ptrActive, 'Int64'), 'Int64', NumGet(ptrActive, 8, 'Int64'), ActiveScheme)
DllCall('LocalFree', 'Ptr', ptrActive)

Loop Schemes.Length
{
  If CompareGUID(ActiveScheme, Schemes[A_Index])
    MsgBox('Bingo!')
}

CompareGUID(p1, p2) => (NumGet(p1, 'Int64') = NumGet(p2, 'Int64') && NumGet(p1, 8, 'Int64') = NumGet(p2, 8, 'Int64'))
какие ещё способы сравнивать бинарные GUID'ы возможно реализовать силами Autohotkey ?
Please post your script code inside [code] ... [/code] block. Thank you.

teadrinker
Posts: 4411
Joined: 29 Mar 2015, 09:41
Contact:

Re: Способы сравнения бинарных значений GUID в Autohotkey  Topic is solved

Post by teadrinker » 20 Oct 2023, 20:56

Попробуйте так:

Code: Select all

CompareGUID(p1, p2) => DllCall('Ole32\IsEqualGUID', 'Ptr', p1, 'Ptr', p2)

vmech
Posts: 374
Joined: 25 Aug 2019, 13:03

Re: Способы сравнения бинарных значений GUID в Autohotkey

Post by vmech » 28 Oct 2023, 17:58

teadrinker wrote:
20 Oct 2023, 20:56
Попробуйте так:

Code: Select all

CompareGUID(p1, p2) => DllCall('Ole32\IsEqualGUID', 'Ptr', p1, 'Ptr', p2)
Вобщем забавная штука... Если в циклах бенча вызывать оба варианта через объекты функций, то вариант с NumGet получается немного быстрее, чем вариант с DllCall.
Вызовы через прослойку
Если же в циклах бенча использовать прямые вызовы, без прослоек, тогда наблюдается примерный паритет.
Прямые вызовы
А в целом, именно для сравнения единичных значений, оба варианта одинаково хороши.
Please post your script code inside [code] ... [/code] block. Thank you.

teadrinker
Posts: 4411
Joined: 29 Mar 2015, 09:41
Contact:

Re: Способы сравнения бинарных значений GUID в Autohotkey

Post by teadrinker » 29 Oct 2023, 14:33

Вы можете ускорить работу с dll в цикле, если укажете #DllLoad 'Ole32.dll' в начале скрипта.

vmech
Posts: 374
Joined: 25 Aug 2019, 13:03

Re: Способы сравнения бинарных значений GUID в Autohotkey

Post by vmech » 30 Oct 2023, 02:32

teadrinker wrote:
29 Oct 2023, 14:33
Вы можете ускорить работу с dll в цикле, если укажете #DllLoad 'Ole32.dll' в начале скрипта.
Я пробовал и #DllLoad, и вызовы LoadLibrary с GetProcAddress, но, по каким то причинам, эти шаги не ускорили работу с внешними функциями ни на миллисекунду.
Мне неизвестны причины такого поведения, но я осмелился предположить, что, вероятно, v2 эффективно линкует вызовы функций из DllCall ещё на стадии первичной обработки исходного кода скриптов.
А м.б. причина в более эффективной сборке бинарников библиотек в новейших ОС Windows. Или ещё каких то оптимизациях ОС.
А м.б. в совокупности обоих факторов :)

ЗЫ. Проверка времени исполнения проводилась на гораздо более тяжелом варианте вызовов функций CLSIDFromString --> StringFromCLSID. В том числе с замерами с помощью QueryPerformanceCounter. На миллионы вызовов погрешность времени исполнения укладывалась в доли миллисекунд (десятки/сотни микросекунд).
ЗЫЫ. Тенденция значительного увеличения накладных расходов при вызовах функций библиотек через прослойку в виде собственных функций Autohotkey так же сохранилась. И не отличалась для вариантов с динамической линковкой, и принудительно загруженных машинных адресов функций.
Please post your script code inside [code] ... [/code] block. Thank you.

teadrinker
Posts: 4411
Joined: 29 Mar 2015, 09:41
Contact:

Re: Способы сравнения бинарных значений GUID в Autohotkey

Post by teadrinker » 30 Oct 2023, 11:55

Да, действительно, я не проверил. Оказывается, библиотека Ole32.dll уже загружена в AHK процесс. Проверить можно так:

Code: Select all

MsgBox DllCall('GetModuleHandle', 'Str', 'Ole32.dll')
в отличие от, например, Gdiplus.dll:

Code: Select all

MsgBox DllCall('GetModuleHandle', 'Str', 'Gdiplus.dll')

vmech
Posts: 374
Joined: 25 Aug 2019, 13:03

Re: Способы сравнения бинарных значений GUID в Autohotkey

Post by vmech » 30 Oct 2023, 12:31

Да уж... Под 10-кой 64-бита загружается «вагон и маленькая тележка» библиотек
Spoiler
Please post your script code inside [code] ... [/code] block. Thank you.

Post Reply

Return to “Помощь”