Vovsla [?]
DismInitialize может возвращать значения:
Да, может, а может другие WINAPI ошибки, но это не точно, в общем случае всегда нужно смотреть на тип возвращаемого значения, а это нулевой параметр.
Все эти DISMAPI_E_DISMAPI_ALREADY_INITIALIZED или ERROR_ELEVATION_REQUIRED это цифровые константы, но в документации microsoft никогда, (очень редко) не пишет их значения. Нужно скачивать SDK или пользоваться гуглом для поиска. Вот, например, парочка констант:
DISMAPI_E_DISMAPI_ALREADY_INITIALIZED = 1, ERROR_ELEVATION_REQUIRED = 0x800702E4, S_OK = 0
Если функция выполнилась как задумано - она должна возвращать S_OK. НО! Это все актуально если тип возвращаемого = HRESULT
Если бы функция возвращала BOOL, то в случае успеха она бы возвращала 1, а в случае ошибки 0.
Размерность массива $aData = 4
Да, DLLCall всегда возвращает массив! Но, только в том случае, если @error равен 0, в документации так и написано:
Успех: @error = 0.
Ошибка: Устанавливает @error
@error: 1 - невозможно использовать файл DLL,
2 неизвестный возвращаемый тип (return type).
3 функция не найдена в файле DLL.
4 неверное количество параметров.
5 неверный параметр.
Если вы ошибаетесь в количестве параметров, или имени функции, то сломаетесь еще до момента проверки результата, поэтому всегда сперва проверяется флаг @error и только затем сам результат. Как только функция отлажена, и вы уверены что правильно вызываете, то можно проверку на @error убирать. Но обычно оставляют.
$aData[1] всегда = 2, что это значит?
Смотрите, DLLCall вызывает функцию, которая может возвращать значения. Она может возвратить ноль, одно, два, три и так далее. Как быть и как их все получить? В других языках такие возвращаемые значения передаются в переменных по ссылкам, но не в AutoIT (с 1 исключением, struct* заполняются сами). В AutoIT подумали и решили, все, что попадает в функцию и все то, что она возвращает - возвращать в виде массива! Так и получается, сколько у функции параметров - такой и размер массива. Результат - нулевой параметр - он
всегда в [ 0], в [1] - первый параметр, В [2] и [3] второй и третий параметр функции.
Почему в [1] стоит 2 - я сам туда ее передал. ;)
С этой функцией все просто, все параметры - входящие, не очень интересно, посмотри на
HRESULT WINAPI DismOpenSession(
_In_ PCWSTR ImagePath,
_In_opt_ PCWSTR WindowsDirectory,
_In_opt_ PCWSTR SystemDrive,
_Out_ DismSession *Session
);
4 параметр(_Out_ DismSession *Session) записан как
_Out_ - именно в него функция запишет результат, его можно получить как $aData[4], и т.к он параметр OUT или то, что он в документации
*Session, то записывается со звездочкой в конце ('uint
*',
0).
Там записан
0, т.к синтаксис требует передачу чего то. Чего - то у нас обычно либо NULL либо 0, а еще потому - что это параметр ТОЛЬКО выходной, функция вообще его не читает, ты можешь туда передавать 123124123 например, но это не разумно, поэтому 0.
Бывает, что параметр одновременно и входящий и выходящий
_Inout_ тогда то, что туда передано имеет значение - нужно читать документацию.
Бывают еще _In_opt_ - входящий не обязательный, _Out_opt_ выходящий не обязательный итп.