2013-03-29 2 views
0

Я пытаюсь вызвать Advapi32.LsaOpenPolicy() из базового кода MSI InstallShield. Я успешно вызвал другие методы avdapi32.dll; Но LsaOPenPolicy выбрасывает ошибку несоответствующего типа.InstallShield вызов метода ошибки метода advapi32.dll

Мой прототип:

prototype INT Advapi32.LsaOpenPolicy(POINTER, POINTER, INT, POINTER); 

Определение окон:

NTSTATUS LsaOpenPolicy(
    _In_  PLSA_UNICODE_STRING SystemName, 
    _In_  PLSA_OBJECT_ATTRIBUTES ObjectAttributes, 
    _In_  ACCESS_MASK DesiredAccess, 
    _Inout_ PLSA_HANDLE PolicyHandle 
); 

Я отметил в образцах C++, что структура ObjectAttriibute обнуляется. Поэтому я делаю что-то подобное здесь в коде InstallShield - pArray указывает на содержимое массива.

for i = 0 to 11 
     array(i) = 0; 
    endfor; 
    array(0) = 24; 

    // current error is 80020005 type mismatch. 
    try 
     i = POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES; 
     pArray = array; 
     pPolicy = NULL; 
     nvOSResult = LsaOpenPolicy(NULL, pArray, i, pPolicy); 
    catch 
     Sprintf(errString, "0x%08x", Err.Number); 
     _Logger(hMSI, methodName, "LsaOpenPolicy Exception "+errString, INFORMATION, FALSE); 
     nvOSResult = Err.Number; 
    endcatch; 

Нет другой информации, которую я могу найти, кроме ошибки 80020005; Я пробовал несколько различных конструкций аргументов, но я не могу пройти мимо этого.

Я разместил это на форуме flexera и microsoft, но у меня там не было никакой тяги. (ссылки для потомков: flexera-link, microsoft-link)

Любая помощь или предложения приветствуются!

+0

Прошу прощения, 10 лет назад я бы все это пережил, но в эти дни я не вижу смысла вкладывать это усилие в InstallScript. Я бы сделал это как пользовательское действие C++ или пользовательское действие C#. Если вы пытаетесь сделать то, что, как я думаю, вы пытаетесь сделать (большой вход в систему как услуга для учетной записи), есть гораздо более простые способы сделать это в встроенном в WiX модуле слияния, который затем потребляется InstallShield. –

+0

Пользовательское действие с использованием C++ звучит как интересное предложение. Я не знаком с WiX. – user2097370

+0

Чтобы закончить цикл, я поместил все в C++ DLL (со статической привязкой), поскольку я столкнулся с несоответствием времени выполнения, но это уже другая история). Я похоронил DLL как двоичные данные в двоичной таблице. – user2097370

ответ

0

Ответ на этот вопрос состоял в том, чтобы фактически обходить интерфейс между installshield и системными DLL, перемещая все работы в C++ DLL. По мере усложнения установки я закончил с двумя отдельными функциями DLL, один из которых выполнен в режиме диалога (не admin) и один в режиме отложенного исполнения (admin).

Для передачи информации я использовал API MsiGetProperty(), используя свойства MSI для входных и выходных переменных.

Обратите внимание, что для выполнения отложенного выполнения мне понадобилась функция САПР на стороне установочного экрана, чтобы маршализовать данные в местоположение данных пользовательских действий, а на стороне DLL извлечь данные снова, используя MsiGetProperty(), но получив «CustomActionData», и затем проанализировать полученную строку, содержащую данные с маршалированием.

Смежные вопросы