Создание инсталятора
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание инсталятора

Создание инсталятора

Ответ
Поиск в этой теме
Непрочитано 04.06.2010, 12:08 #1
Создание инсталятора
mig84
 
Новосибирск
Регистрация: 22.12.2009
Сообщений: 29

Добрый день!
Появилась необходимость создать инсталлятор для библиотеки, написанной на нете для автокада, xтобы после запуска этого пакета при запуске автокада автоматически загружалась эта библиотека.
К сожалению, не смог нигде найти информацию по этому вопросу (может плохо искал). Может кто поделится опытом или ссылкой?
Планируется использовать Inno setup.
Нашел только упоминание о ветке реестра HKCU\Software\Autodesk\Autocad\R180\Acad_xxx:xxx\Aplications.
Попробовал создать руками ключ, но на процесс запуска автокада это, к сожалению, не повлияло.
Просмотров: 9679
 
Непрочитано 04.06.2010, 16:20
#2
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Тема смачная, странно что никто не ответил.
Хотелось бы расширить тему. Добавить еще вопросы автообновления и интегрирования в интерфейс Акада (разных версий и профилей).

Про автозагрузку можно почитать в справке ObjectARX Developer's Guide -> Demand Loading.
Вот пример кода Creating demand-loading entries for .NET modules from outside of AutoCAD

Надеюсь гуру подключаться и опишут концепцию приложения для AutoCAD.
Vildar вне форума  
 
Непрочитано 05.06.2010, 06:40
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Вот как я делаю инсталляторы для ruCAD на InnoSetup - принципиальные моменты:

1. Решить, какие привилегии нужны для запуска самого инсталлятора - только Администратор, или доверить Пользователю. От этого зависят дальнейшие действия.

2. Так как ставятся приложения для AutoCAD, инсталлятор должен проверить наличие всех AutoCAD допустимых для данного приложения версий и устанавливаться только если они есть. Пользователь должен выбрать один из AutoCAD. В InnoSetup это делается включением в проект специальной dll.

3. Копирование всех необходимых (отобранных компонентов) файлов куда положено. А не куда вздумается. Бинарные - в Program Files, что-то в AppData (All Users или %Username% в зависимости от стратегии установки). Заодно автоматически регистрируются COM.

4. Запись в реестр или INI всех необходимых настроек. Предпочитаю INI.

5. Создание специальной папки с настройками и компонентами AutoCAD для этого приложения. В своей пользовательской папке - не трогая никагого из Автокадов.

В общем-то это обычные действия, кроме 2.

Пользователь запускает не AutoCAD, а специальную программу-стартер. Здесь можно выполнить дополнительные настройки конкретного пользователя системы (их может быть несколько с разной специализацией), при необходимости сменить рабочий AutoCAD.

Запуск AutoCAD осуществляется из стартера. Для "диких" пользователей возможно создание ярлыка с AutoCAD, но с заданным профилем.

Стартер делает:

1. Проверяет наличие профиля ruCAD в выбранной версии AutoCAD и создает, если такого не было.

2. Включает в начало списка путей поиска выбранного AutoCAD два дополнительных каталога - к "нашим" файлам общим для всех версий (шрифты, линии и т.п) и к специфичным для конкретной версии (cui и т.п.)

3. Генерирует по шаблону файл acaddoc.lsp, который и будет автоматически загружаться с профилем ruCAD. В этом файле создаются все необходимые настройки, загружаются необходимые библиотеки. NET я не использую, но в acadoc.lsp можно включить всё, что угодно, в том числе какие-то дополнительные программы - только редактировать надо шаблон этого файла.
ShaggyDoc вне форума  
 
Непрочитано 06.06.2010, 12:38
#4
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Предлагаю на всеобщее обозрение, отечественная разработка.
http://www.createinstall.ru
(у меня стоит пробная 30 дневная full версия, тестирование провожу на ней)

В архиве прилагается мини сборка совместная работа автора (Кривоногов А.Г) программы-инсталлятора со мной. Работает на х32(проверенно XP) и х64(проверенно 7), соответственно AutoCAD 2010 x32(AutoCAD 2006 x32) и AutoCAD 2010 x64, как швейцарские часы.

Инсталляция развертывает Ваши установочные файлы в любую удобную для вас папку.

Т.к мы с автором программы занимаемся созданием инсталляции совсем недавно, то я предложил следующее
При установке, программа ищет в реестре ветку
[HKEY_CLASSES_ROOT\3dsFile\DefaultIcon]
по ней определяется путь к Автокаду
далее инсталлятор сам определяет путь к файлу acadXXXX.lsp
модифицирует его дабавлением строки вида
(load " c:\\Program Files\\LT\\myLisp.LSP ") где c:\\Program Files\\LT\\ путь зависящий от места установки вашей программы, это все делается автоматически.

И завершающее при деинсталяции программа сама удаляет все записи из реесстра, файлы, в том числе и модифицированную строку.

У инсталлятора колоссальные возможности. Я думаю совместными усилиями можно качественный Российский продукт сделать популярным.

Файл сборку распаковать на диск С в корень(все настроено)
получится должно:
c:\LF\DWG
c:\LF\ODCL
c:\LF\Plugins
c:\LF\LF.ci
Вложения
Тип файла: zip LF.zip (18.1 Кб, 125 просмотров)

Последний раз редактировалось sdv79, 06.06.2010 в 12:44.
sdv79 вне форума  
 
Непрочитано 16.06.2010, 11:22
#5
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Так как ставятся приложения для AutoCAD, инсталлятор должен проверить наличие всех AutoCAD допустимых для данного приложения версий и устанавливаться только если они есть. Пользователь должен выбрать один из AutoCAD.
Не могли бы вы показать пример подобного кода? А то у меня получается множественный вложенный цикл, в середине написания которого я понимаю, что что-то делаю нет так =)

Код:
[Выделить все]
if RegGetSubkeyNames(HKEY_LOCAL_Machine, 'SOFTWARE\Autodesk\AutoCAD\', Names) then
  begin
    for i:=0 to GetArrayLength(Names)-1 do
       if RegGetSubkeyNames(Names[i], Names2) then
          begin
             for j:=0 to GetArrayLength(Names2)-1 do
             if RegGetSubkeyNames(Names2[j], Names3) then
                begin
                for k:=0 to GetArrayLength(Names3)-1 do
                   if (Names3[k] = 'ProductName') and ...
                              тут надо бы проверить, является ли очередной ProductName одним из членов списка (в списке должны быть имена вроде "AutoCAD 2008" "AutoCAD 2011" "AutoCAD Architectural Desktop 2007" и т.п.)
ну а дальше я окончательно запутался =)

Последний раз редактировалось Tonic, 16.06.2010 в 17:47.
Tonic вне форума  
 
Непрочитано 18.06.2010, 11:27
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Ну, например у меня так (Pascal):

Код:
[Выделить все]
procedure ruGetACADExePathNames(var lst: TStringList);

  procedure GetAcadReleaseList(const Rel: string);
  var
    r: TRegistry;
    s,
      rList: TStringList;
    i,
      c: integer;
  begin
    r := TRegistry.Create;
    r.RootKey := HKEY_LOCAL_MACHINE;
    s := TStringList.Create;
    rList := TStringList.Create;
    if r.OpenKey(keyAcadRegRoot, false)
      then begin
      r.GetKeyNames(s);
      r.CloseKey;
      for i := 0 to s.Count - 1 do
        if (AnsiStrLIComp(pchar(Rel), pchar(s[i]), length(Rel)) = 0)
          then rList.Add(keyAcadRegRoot + '\' + s[i]);
      for i := 0 to rList.Count - 1 do begin
        r.CloseKey;
        r.OpenKey(rList[i], false);
        s.Clear;
        r.GetKeyNames(s);
        for c := 0 to s.Count - 1 do begin
          if (AnsiStrLIComp('ACAD', pchar(s[c]), 4) = 0)
            then begin
            r.CloseKey;
            if r.OpenKey(rList[i] + '\' + s[c], false)
              then begin
              lst.Add(copy(rList[i], (LastDelimiter('\', rList[i]) + 1), maxInt) + '\' +
                s[c] + '=' +
                r.ReadString('ProductName') + ' ' +
                r.ReadString('Language') + ', ' + Rel);
            end;
          end;
        end;
      end;
    end;
    s.Free;
    rList.Free;
    r.CloseKey;
    r.Free;
  end;
begin
  GetAcadReleaseList('R14.0');
  GetAcadReleaseList('R15.0');
  GetAcadReleaseList('R16.1');
  GetAcadReleaseList('R16.2');
  GetAcadReleaseList('R17.0');
  GetAcadReleaseList('R17.1');
  GetAcadReleaseList('R17.2');
  GetAcadReleaseList('R18.0');
  GetAcadReleaseList('R18.1');
  GetAcadReleaseList('R18.2');
end;
Вот ещё - поиск строки соединения по имени EXE-файла:

Код:
[Выделить все]
function ruFindAcadAppString(ExeName: string): string;

  function FindForAppVer(AcadApp, ExeName: string): string;
  var
    Acad_CLSID, AcadLocalServer32: string;
  begin
    Result := '';
    Acad_CLSID := '';
    AcadLocalServer32 := '';
    try
      Acad_CLSID := RegReadString(HKEY_CLASSES_ROOT, AcadApp + '\CLSID', '');
    except
    end;
    if (Acad_CLSID <> '') then begin
      try
        AcadLocalServer32 := RegReadString(HKEY_CLASSES_ROOT, 'CLSID\' + Acad_CLSID + '\LocalServer32', '');
      except
      end;
      if (AcadLocalServer32 <> '') then
        if StrFind(ExeName, AcadLocalServer32, 1) > 0 then
          Result := AcadApp;
    end;
  end;

begin
    Result := FindForAppVer('AutoCAD.Application.14.0', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.15.0', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.16.2', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.17.0', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.17.1', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.17.2', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.17.3', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.18.0', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.18.1', ExeName);
  if Result = '' then
    Result := FindForAppVer('AutoCAD.Application.18.2', ExeName);
  if Result = '' then
  Result := FindForAppVer('AutoCAD.Application', ExeName);

end;
Здесь константы зашиты в программу, хотя можно было бы вынести в файл.
ShaggyDoc вне форума  
 
Непрочитано 18.06.2010, 17:14
#7
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


У меня вот так получилось:

Код:
[Выделить все]
if RegGetSubkeyNames(HKEY_LOCAL_Machine, 'SOFTWARE\Autodesk\AutoCAD\', Names) then
  begin
    for i:=0 to GetArrayLength(Names)-1 do
      if RegGetSubkeyNames(HKEY_LOCAL_Machine, ('SOFTWARE\Autodesk\AutoCAD\' + Names[i] + '\'), Names2) then
        begin
          for j:=0 to GetArrayLength(Names2)-1 do
            begin
              if RegGetValueNames (HKEY_LOCAL_Machine, ('SOFTWARE\Autodesk\AutoCAD\' + Names[i] + '\'+ Names2[j] + '\'), Names3) then
                begin
                  for k:=0 to GetArrayLength(Names3)-1 do
                    if (Names3[k] = 'ProductName') then
                      begin
                        RegQueryStringValue(HKEY_LOCAL_Machine, ('SOFTWARE\Autodesk\AutoCAD\' + Names[i] + '\'+ Names2[j] + '\'),Names3[k],version);
                          if ((version = 'AutoCAD 2007') or
                              (version = 'AutoCAD 2008') or
                              (version = 'AutoCAD 2009') or
                              (version = 'AutoCAD 2010') or
                              (version = 'AutoCAD 2011')) then
                                begin
                                  regpath := ('SOFTWARE\Autodesk\AutoCAD\' + Names[i] + '\'+ Names2[j]);
                                  RegQueryStringValue(HKEY_LOCAL_Machine,('SOFTWARE\Autodesk\AutoCAD\' + Names[i] + '\'+ Names2[j] + '\'),'AcadLocation',installpath);
                                  if (Pos(version, '2007') = 0) then ACAD7:=true;
                                  if (Pos(version, '2008') = 0) then ACAD8:=true;
                                  if (Pos(version, '2009') = 0) then ACAD9:=true;
                                  if (Pos(version, '2010') = 0) then ACAD10:=true;
                                  if (Pos(version, '2011') = 0) then ACAD11:=true;
                                end;
                       end;
                  end;
             end;
         end;
  end
Tonic вне форума  
 
Непрочитано 18.06.2010, 17:44
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Tonic Посмотреть сообщение
У меня вот так получилось:
Смотрел поверхностно, но похоже, что ты не учел "вертикальные" приложения (AA, MEP, MDT и т.д.)
Александр Ривилис вне форума  
 
Непрочитано 18.06.2010, 18:42
#9
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
не учел "вертикальные" приложения (AA, MEP, MDT и т.д.)
Так и есть. У меня нет возможности проверить работоспособность кода на них. Но если вы напишете, что ADT или MEP (и т.д.) ведут себя точно также, как и соответствующие им версии чистого AutoCAD, я введу такую проверку и для вертикальных решений 2007-2011.
Tonic вне форума  
 
Непрочитано 18.06.2010, 23:04
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Ведут. Проверено неоднократно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.06.2010, 00:15
#11
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Отлично, спасибо. Так, конечно, лучше.
Tonic вне форума  
 
Непрочитано 21.06.2010, 17:28
#12
acyxou


 
Регистрация: 12.07.2008
Сообщений: 211


ShaggyDoc, здравствуйте! Вопрос не совсем в тему, но все же: подскажите, пожалуйста, как в Inno-Setup при установке приложения считывать данные реестра, записывать их куда-то (лучше туда же, - в реестр), а при удалении приложения - восстанавливать исходные значения реестра?
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 21.06.2010, 18:02
#13
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от acyxou Посмотреть сообщение
ShaggyDoc, здравствуйте! Вопрос не совсем в тему, но все же: подскажите, пожалуйста, как в Inno-Setup при установке приложения считывать данные реестра, записывать их куда-то (лучше туда же, - в реестр), а при удалении приложения - восстанавливать исходные значения реестра?
Писать данные инсталлятор может в реестр или INI. Для этого специальные секции [Registry] и [Ini] в сценарии.
Чтобы при деинсталляции удалялись значения имеются ключи uninsdeletekey, uninsdeletekeyifempty, uninsdeletevalue

Есть и специальная секция сценария [UninstallDelete] - тут можно записать действия при удалении чего-то, не создававшегося при инсталляции.

А вот чтобы прочитать что-то до инсталляции, надо в секции [code] написать свою функцию. Там надо писать на Pascal. Имеется множество доступных функций (в том числе для работы с реестром).

Если встроенных функций вдруг не хватит, можно написать свои и поместить их в DLL.

Есть и секция [UninstallRun] в которой можно предусмотреть запуск какого-то приложения при деинсталляции.

Всё подробно в справке.
ShaggyDoc вне форума  
 
Непрочитано 21.06.2010, 18:10
#14
acyxou


 
Регистрация: 12.07.2008
Сообщений: 211


ShaggyDoc, спасибо, но я расчитывал получить пример функции на Pascal script, если не трудно
__________________
Users are not stupid, they are busy.
acyxou вне форума  
 
Непрочитано 21.06.2010, 20:30
#15
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от acyxou Посмотреть сообщение
ShaggyDoc, спасибо, но я расчитывал получить пример функции на Pascal script, если не трудно
Примеры в c:\Program Files\Inno Setup 5\Examples\, в том числе с Code. Да и весь InnoSetup в исходниках поставляется.

А еще есть Inno Setup Knowledge Base

Все равно свой код самостоятельно писать надо.
ShaggyDoc вне форума  
 
Непрочитано 21.06.2010, 20:57
#16
acyxou


 
Регистрация: 12.07.2008
Сообщений: 211


я это все уже давно проштудировал. Не нашел я там такой функции чтоб возвращала значение ключа..... а компилить свои dll я еще не умею... я ведь не программист и не хочу им быть
Не понимаю почему такую функцию не включили в пакет Inno
из-за того что так и не нашел решение этой проблемы, надумал создать инсталлятор в WIX...
__________________
Users are not stupid, they are busy.

Последний раз редактировалось acyxou, 21.06.2010 в 23:11.
acyxou вне форума  
 
Непрочитано 22.06.2010, 01:40
#17
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Есть, правда, один вопрос... при создании проекта в C# мастером можно выбрать поддержку MEP и Architecture. Зачем, если в них должно всё также работать, как в чистом AutoCAD? И почему только эти 2 программы, ведь есть и Electric, и Mechanic, и другие.
Tonic вне форума  
 
Непрочитано 22.06.2010, 06:40
#18
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Не понимаю почему такую функцию не включили в пакет Inno
Как это не включили? Есть все функции (16 штук) для работы с реестром. Все их можно использовать в своих функциях в секции Code. Например (прямо из справки InnoSetup):

Код:
[Выделить все]
var
  Country: String;
begin
  if RegQueryStringValue(HKEY_CURRENT_USER, 'Control Panel\International',
     'sCountry', Country) then
  begin
    MsgBox('Your country: ' + Country, mbInformation, MB_OK);
  end;
end;
Здесь использована

Код:
[Выделить все]
function RegQueryStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
и обычный способ извлечения значения через переменную var ResultStr: String.
Оберните этот код из примера своей функцией, например (самый примитивный вариант):

Цитата:
function MyRegReadString (): String;
var Default : string;
begin
Default:='Хрень какая-то';
Result := Default;
if RegQueryStringValue(HKEY_CURRENT_USER, 'Software\MyProgramm',
'MyKey', Default) then Result := Defaul;
end;
Теперь в сценарии можно использовать значение в виде
{code:MyRegReadString};

В секции Code можно создавать свои константы и переменные.
ShaggyDoc вне форума  
 
Непрочитано 22.06.2010, 10:21
#19
acyxou


 
Регистрация: 12.07.2008
Сообщений: 211


ShaggyDoc, вот теперь ОГРОМНОЕ спасибо!
Я почему то думал, что данная функция сравнивает принимаемую строку со значением, находящимся в ключе реестра, и если они совпадают то true, если нет - false. А оказывается нет....
Еще раз спасибо!

ЗЫ. Мои извинения за выпады в адрес Inno Setup
__________________
Users are not stupid, they are busy.

Последний раз редактировалось acyxou, 22.06.2010 в 11:11.
acyxou вне форума  
 
Непрочитано 23.06.2010, 08:32
#20
Lidia.Antipina


 
Регистрация: 24.02.2009
Сообщений: 4


В Visual Studio можно создавать попутно с созданием приложения инсталляционный пакет (особенно если писать на С#, то наверняка в среде VS) и ничего не надо дополнительно.
Пока не получилось инсталлировать новую версию по-верху, но думаю, что там все можно.
Что касается выбора приложения AutoCAD для загрузки, то пока этим рулю вручную при загрузке адаптаций cui, cuix c помощью команды НПИ. При загрузке меню .Cui проверяется автоматически наличие одноименного .mnl-файла, а в нем я проверяю версию AutoCAD и загружаю версию сборки приложений, прикрепленных к .cui, или выдаю сообщение об ошибке.

Последний раз редактировалось Lidia.Antipina, 23.06.2010 в 08:46.
Lidia.Antipina вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание инсталятора



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание диалоговых окон в AutoCAD TwoZero Программирование 145 11.03.2015 18:15
Создание единого принципа работы в AutoCAD 2009, в отдельно взятой проектной фирме. milamu AutoCAD 175 27.11.2009 15:38
Создание разных типов линий Андрей77 AutoCAD 2 09.02.2009 01:03
Создание инсталятора с помощью NSIS Oracul Программирование 2 25.01.2005 22:16
Одна из целей: Создание экспертных систем на базе AutoCAD. Сергей Юрьевич Программирование 9 01.01.2005 15:17