Что нового

Рассчет GUID по версии 1 Time Based (есть код на С++ и VBA) Нужно в Autoit

Пост номер 2 был отмечен как лучший ответ.

Tyr

Новичок
Сообщения
43
Репутация
4
Версия AutoIt:
3.3.6.1
Описание:
Есть эксель, который умеет расчитывать GUID + к нему проверочный элемент,
Eсть ГОСТ Р ИСО/МЭК 9834-8-2011 Информационная технология (ИТ). Взаимосвязь открытых систем, в котором есть пример на C++, но он для VC++5 который сейчас врядли у кого-то есть.
Нужно делать рассчет ГУИД, либо как в экселе с контрольной суммой, либо без - (рабочий алгоритм контрольной суммы гуида есть отдельно).
Проблема в том, что данные нужно получать в программу на сервере, где нельзя установить Excel. Нужно, что бы при запуске программы она как параметр передавала обратно GUID
 

Вложения

InnI

AutoIT Гуру
Сообщения
4 237
Репутация
1 123
Вот переделал _WinAPI_CreateGUID (версия 4) под UuidCreateSequential (версия 1)
Код:
MsgBox(0, "UUID", _UuidCreateSequential())

Func _UuidCreateSequential()
    Local $tGUID = DllStructCreate("ulong Data1;ushort Data2;ushort Data3;byte Data4[8]")
    Local $aReturn = DllCall("Rpcrt4.dll", "long", "UuidCreateSequential", "struct*", $tGUID)
    If @error Then Return SetError(@error, @extended, "")
    If $aReturn[0] Then Return SetError(10, $aReturn[0], "")
    $aReturn = DllCall("ole32.dll", "int", "StringFromGUID2", "struct*", $tGUID, "wstr", "", "int", 65536)
    If @error Or Not $aReturn[0] Then Return SetError(@error + 20, @extended, "")
    Return $aReturn[2]
EndFunc
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
Вот переделал _WinAPI_CreateGUID (версия 4) под UuidCreateSequential (версия 1)
Код:
MsgBox(0, "UUID", _UuidCreateSequential())
    If @error Then Return SetError(@error, @extended, "")
Спасибо за отзывчивость.
Выдаёт в сообщение то, что получил в результате ошибки в 6 строке, если убрать третий параметр SetError, то: "1"

Обычно для 4-ой версии я пользовался двумя строчками:
TypeLib = ActiveX("Scriptlet.TypeLib")
guid = TypeLib.Guid
Но для первогу ГУИДА не нашел ничего похлжего...
Есть предположения в чем может быть проблема? Библиотка Rpcrt4.dll на компьютере есть.
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
в версии AutoIt 3.3.6.1
Спаибо.
Дело было именно в этом.
Понял, просто вместо CreateObject("Scriptlet.TypeLib").GUID или CoCreateGuid (которые только 4ую версию генерируют) я мог воспользоватся UuidCreateSequential
Хотя, сам код, как это делается не совсем понял. Но в любом случае он намного компактнее того что я ранее писал с функцией CoCreateGuid Windows API
Сообщение автоматически объединено:

Может в версии AutoIt 3.3.6.1? У меня минимальная 3.3.8.0. Проверил на Win7x86/64 и Win10x64 - везде код работает.
А можно еще вопрос:
Возможно существует способ при запуске скрипта внешней программой, вернуть в программу Guid, как ответ от заупуска EXE, или возможно обратится как к элементу ActiveX?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 237
Репутация
1 123
способ при запуске скрипта внешней программой, вернуть в программу Guid
Как любая программа скомпилированный скрипт может вернуть код выхода. Но это просто число (int).
Если внешняя программа умеет читать стандартный (консольный) поток вывода, то можно скомпилировать консольный скрипт и записать строку GUID в поток вывода через ConsoleWrite().
В противном случае нужно использовать любое межпроцессное взаимодействие: буфер обмена, файлы, общая память, обмен сообщениями и т.д.

Кстати, не забывайте, что AutoIt - это язык автоматизации. С помощью Send() или ControlSend() можно отправить GUID непосредственно в окно/элемент другой программы.
 
Автор
Tyr

Tyr

Новичок
Сообщения
43
Репутация
4
Как любая программа скомпилированный скрипт может вернуть код выхода. Но это просто число (int).
Если внешняя программа умеет читать стандартный (консольный) поток вывода, то можно скомпилировать консольный скрипт и записать строку GUID в поток вывода через ConsoleWrite().
В противном случае нужно использовать любое межпроцессное взаимодействие: буфер обмена, файлы, общая память, обмен сообщениями и т.д.

Кстати, не забывайте, что AutoIt - это язык автоматизации. С помощью Send() или ControlSend() можно отправить GUID непосредственно в окно/элемент другой программы.
1) Про INT понял что в exit code ничего сложного не передать.
2) почему-то если пытаюсь считать вывод, то получаю -2 ?, если же просто печатаю, то: 0
пропало конвертирование в консольное прил, решил добавлением строки:
Код:
#pragma compile(Console, True)
, но появился значек запуска под админом. (к сожалению этот способ пока не осилил)
3) файловый метод - первовое, что пришло в голову:
Код:
FileClose(FileOpen($sFile, 2))
создал файл, считал имя, удалил файл. - РАБОТАЕТ

Уникальность такого GUID прихрамывает, но на тех объемах что есть сейчас - достаточен: GUID всегда выходит с окончанием XXXXXXXX-DDFX-11E9-A4C1-00155D15C500 т.е. по факту уникальны только первые 8 символов помеченные X (время)
 
Верх