На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ Inno Setup
Пожалуйста, выделяйте текст инсталлятора написанного на Inno Setup тегом [сode=ins] ... [/сode]. Для этого используйте кнопку [code=ins] в форме ответа или комбобокс, если нужно вставить код из другой программы.


Обязательно указывать:

  • Программу, используемую для создания инсталлятора.



Если в ходе решения проблемы возникли дополнительные вопросы, по возможности задаем их в той же теме.


Выразить свое отношение к модераторам раздела можно здесь: Profi, Fester
Модераторы: Fester, Profi
  
> RegDBGetKeyValueEx падает с ошибкой, при попытке получить значение из реестра., IS12
    Всем привет.

    Столкнулся с проблемой. Мне нужно запилить в инсталятор с помощью InstallShield 12, такую фичу:
    Есть SharePoint разных версий. В зависимости от версии он ставится по определенному пути. В общем сделал я у себя CustomAction, и наваял скрипт, который должен узнавать по какому пути расположен SharePoint, и записывать его местоположение в определенную проперти:
    ExpandedWrap disabled
      function DetectSharePointDir(hMSI)  
          // To Do:  Declare local variables.
      begin            
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\12.0", "Version", "SHAREPOINT_VERSION");
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\12.0", "SharePoint", "SHAREPOINT_INSTALLED");
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\12.0", "Location", "SHAREPOINTDIR");
          
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\14.0", "Version", "SHAREPOINT_VERSION");
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\14.0", "SharePoint", "SHAREPOINT_INSTALLED");
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\14.0", "Location", "SHAREPOINTDIR");
       
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\15.0", "Version", "SHAREPOINT_VERSION");
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\15.0", "SharePoint", "SHAREPOINT_INSTALLED");
          SetSharePointInfoToProperty(hMSI, "SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\15.0", "Location", "SHAREPOINTDIR");
       
      end;
       
      function SetSharePointInfoToProperty(hMSI, szKey, szName, szProperty)
          NUMBER nvType, nvSize, nResult;
          STRING szSharePointProperty;    
      begin    
          RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
                                          
          nResult = RegDBGetKeyValueEx("SOFTWARE\\Microsoft\\Shared Tools\\Web Server Extensions\\15.0", "Location", nvType, szSharePointProperty, nvSize ); //! Вот это просто для теста
          MessageBox(FormatMessage(nResult), SEVERE);
          
          if (RegDBKeyExist(szKey) == 1)  then
             if (RegDBGetKeyValueEx(szKey, szName, nvType, szSharePointProperty, nvSize) == 0)  then
                MsiSetProperty(hMSI, szProperty, szSharePointProperty);        
             endif;
          endif;
      end;

    Так вот возникла проблема с функцией RegDBGetKeyValueEx - она мне возвращает ошибку аля "Файл не найден", т.е. как я понимаю она не может вычитать из реестра значение нужной мне опции в реестре. Хотя RegDBKeyExist - выполняется без проблем. Все эти значения в реестре существуют.
    Что я делаю не так?

    Спасибо.

    Добавлено
    Хотя вот сейчас попробовал из примера:
    ExpandedWrap disabled
      nResult = RegDBGetKeyValueEx("Software\\Microsoft\\Windows NT\\CurrentVersion","RegisteredOwner",nvType,svRegisteredOwner,nvSize);

    Работает. Почему она тогда не хочет мое значение считывать? В чем косяк то? :huh:
    В реестре реально по вышеозвученным путям все есть.
    Сообщение отредактировано: KILLER -
      В общем вроде разобрался. Проблема была в том, что нужно было поставить следующую опцию, перед чтением реестра:
      ExpandedWrap disabled
        ...
        REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY;
         
        if (RegDBKeyExist(szKey) == 1)  then
               if (RegDBGetKeyValueEx(szKey, szName, nvType, szSharePointProperty, nvSize) == 0)  then
        ...

      Но теперь возникла другая проблема, почему то записывается путь Program Files, а IS показывает Program File(x86) :-? :wall:
        Разобрался.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,0854 ]   [ 17 queries used ]   [ Generated: 11.07.20, 07:19 GMT ]