Тема: И еще об автозагрузке

Как вам такая идея?
Записываем в реестр на автозагрузку при старте Windows свой exe-файл, который работает в фоновом режиме и отлавливает запуск AutoCAD. Как только отловил - загружает туда то, что нужно.
Вот код:

Option Explicit
'ветвь реестра: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
'имя параметра: ACADRun
'значение параметра: D:\CURRENT\RegAutoload\RunTest.exe
Sub Main()
    Dim app As Object
    'параметр обеспечивающий автозагрузку при повторных запусках AutoCAD в продолжении сеанса Windows
    Dim Flag As Boolean
    Flag = True
    On Error Resume Next
    Do
       Do
            Err.Clear
            'получаем объект "AutoCAD.Application"
            Set app = GetObject(, "AutoCAD.Application")
            If (Err.Number = 429) Then
            'AutoCAD не запущен
                Flag = True
            End If
        Loop While (Err.Number = 429) 'end do
        If (Flag) Then
            If (app.Version = "15.06") Then
               app.ActiveDocument.SendCommand "(load ""MyStartUp.lsp"") "
               Flag = False
            End If
        End If
        Set app = Nothing
    Loop While (Err.Number <> 429) 'end do
End Sub

Re: И еще об автозагрузке

Практика показывает, что при выключении компьютера Windows расстается с нашей фоновой программкой мучительно трудно. Может кто-нибудь посоветует, как избавить его от этих мук?

Re: И еще об автозагрузке

> LeonidSN
Да и вообще должна грузить процессор по полной. Нужно вставить какую-то задержку внутри (что-то типа Sleep - аналога в VB не знаю) цикла.

Re: И еще об автозагрузке

> Александр Ривилис
Спасибо за совет!
Вставил в цикл задержку 0,1сек и теперь модуль работает и выходит из работы вполне корректно.
Мне вот что неожиданно - неужели никого не заинтересовала идея и никому нечего покритиковать?

Re: И еще об автозагрузке

> LeonidSN
Идея интересная, хотя я бы не рискнул так поступать.

Re: И еще об автозагрузке

Возможно кто-нибудь будет тестировать код, поэтому привожу модифицированный (и надеюсь более безопасный) вариант полностью:

Sub Main()
    Dim app As Object
    'параметр обеспечивающий автозагрузку при повторных запусках AutoCAD в продолжении сеанса Windows
    Dim Flag As Boolean
    Flag = True
    On Error Resume Next
    Do
       Do
            Err.Clear
            'получаем объект "AutoCAD.Application"
            Set app = GetObject(, "AutoCAD.Application")
            If (Err.Number = 429) Then
            'AutoCAD не запущен
                Flag = True
            End If
            'pause
          [b]Call vPause[/b]
        Loop While (Err.Number = 429) 'end do
        If (Flag) Then
            If (app.Version = "15.06") Then
               app.ActiveDocument.SendCommand "(load ""MyStartUp.lsp"") "
               Flag = False
            End If
        End If
        Set app = Nothing
    Loop While (Err.Number <> 429) 'end do
End Sub
Private Sub vPause()
    Dim PauseTime As Single
    Dim Start As Single
    Dim Finish As Single
'задержка на 0,1 сек
    PauseTime = 0.1
    Start = Timer
    Do While (Timer < Start + PauseTime)
        DoEvents
    Loop
End Sub

Re: И еще об автозагрузке

А зачем следить за Автокадом? Если назначение твоей программы заставить загрузить свой LSP, то проще надо - генерировать в нужное место acaddoc.lsp своей программой и удалять его при вычходе из нее. Чтоб концы в воду.
В ruCAD сделано так:
1. Есть программа-стартер, которая, наряду с прочими махинациями, запускает требуемый Автокад. При этом ему подсовывается генерируемый acaddoc.lsp. Этот файл создается из шаблона, в который подставляются значения нужных переменных.
2. Если нужна подгрузка еще каких-то файлов, они вносятся в шаблон.
3. Если нужна подгрузка дополнительных меню, они загружаются из специального списка. Меню могут еще и загрузить mnl-файлы.
4. При выходе из стартера он удаляет и acaddoc.
5.Опционально можно оставить acaddoc живым. Тогда можно Автокад просто через ярлык загружать - будет и автозагрузка.

Re: И еще об автозагрузке

> ShaggyDoc
Это то все хорошо и правильно. Есть только один, но большой минус, такой знаете ли минусище: ну вот привыкли пользователи, понимашь, открывать программы двойным кликом по файлу. И это, наверное, правильно. А acaddoc оставлять мне не хочется. Именно для этого случая такая программка и згодиться.

Re: И еще об автозагрузке

Александр Ривилис пишет:

хотя я бы не рискнул так поступать

А можно с этого места поподробнее?

Re: И еще об автозагрузке

> ShaggyDoc
Конечно хочется сделать попроще. Но не только мне, а и каждому пищущему свое Приложение. И  - или я буду топить acaddoc.lsp неизвестного коллеги, или он будет топить мой, ведь ACAD загружает и выполняет только один такой файл. Боюсь, что Пользователь нас не поймет.
Был хороший вариант автозапуска через файл *.mnl, но с появлением в ACAD2006 меню *.cui
я счел за лучшее отказаться от подгрузки своего меню и добавлять его программным способом.
То есть все поиски сводятся к борьбе за независимость своего Приложения. (По привычке чуть не добавил:"...и от здравого смысла")

Re: И еще об автозагрузке

А чем не нравится использование mnl? Он вполне корректно подгружается совместно с cui (проверял на 2006, 2007, в 2008 просто не надо было пока, но не думаю, что там ситуация изменилась).

Re: И еще об автозагрузке

LeonidSN пишет:

То есть все поиски сводятся к борьбе за независимость своего Приложения.

Да. Результаты зависят от "значимости" Приложения. Если это какой-то "довесок", а их могут быть сотни, из разных источников, то конечно они должны просто куда-нибудь дописываться, к "основному" приложению. Если надо - могут использовать свои фрагментарные меню со своим mnl.
Основные проблемы здесь с несовместимостью и некорректным кодом "довесков". Кроме того, необходимы определенные настройки.
Для больших приложений может использоваться и свое меню. В ruCAD сейчас сделано 2 интерфейса, между которыми можно переключаться прямо на лету. Один - "традиционный", в котором используется полное меню с добавлением наиболее часто используемых стандартных команд. Второй - "современный", в котором загружается стандартное меню и меню ruCAD в виде фрагментарного.
Если надо подключить какой-то "довесок", его вписывают в шаблон acaddoc.lsp. Если надо еще какое-то фрагментарное меню - его записывают в список подгружаемых меню. Если "довесок" со своим меню написан правильно - будут подгружаться и его функции.
Если же имеем свалку из разношерстных "лиспов" или еще чего-то, то ничего хорошего не получится. Впрочем, некоторым это нравится - бесконечно настраивать, адаптировать, "тюнинговать". А другим надо много и быстро делать работы - "на конвейере".
Надо определяться с концепцией рабочего места и применять соответствующие решения.

Re: И еще об автозагрузке

> Кулик Алексей aka kpblc
А чем не нравится использование mnl?
Поначалу я сделал два варианта файлов своего фрагментарного меню:
MyMenu.mnu и конвертированный из него в ACAD2006 файл MyMenu.cui, с соответствующими mnl-файлами. И подгружал их с помощью AcadInstall. Однако, когда попробовал такую инсталляцию на ACAD2007, AutoCAD вылетел.
Возникла дилемма - либо садиться и разбираться с особенностями cui-файлов для разл. версий AutoCAD и возможностями AcadInstall, либо перейти на динамически добавляемое меню независимое ни от кого, ни от чего. Второй
вариант мне понравился больше, но возникла проблема автозагрузки. Хвост вытащил - нос завяз, типичные следствия вкусовщины и лени автора... В итоге, появилась идея отлавливать запуск Автокада.

Re: И еще об автозагрузке

> LeonidSN
Была как-то аналогичная проблема, но разбор полетов оказался наиболее эффективным. Вылета AutoCAD'a я не получил ни разу. Черт, сейчас уже не помню, как я это обошел, а разбираться сейчас некогда. Есть предложение - напиши мне на мыло, пообщаемся на эту тему :)(только вряд ли раньше сегодняшнего вечера).

Re: И еще об автозагрузке

При использовании ранее выложенного код возникали проблемы при выходе из сеанса Windows, типа: Program not responding. Чтобы уйти от них вставил строчку:
OpenForm = DoEvents.
Здесь OpenForm - формальный параметр, помогает кооректно вписать в код функцию DoEvents.

Option Explicit
Public Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)
Sub Main()
    Dim OpenForm As Integer
    Dim app As Object
    Dim StartFlag As Boolean 'StartFlag -
    StartFlag = True
    On Error Resume Next
    Do
          Do
               Err.Clear
            Set app = GetObject(, "AutoCAD.Application")
            If (Err.Number = 429) Then
                StartFlag = True
            End If
            [b]OpenForm = DoEvents[/b]
            'pause 0.5 sec
            Sleep 500
        Loop While (Err.Number = 429) 'end do2
        If (StartFlag) Then
            If (TypeOf app Is IAcadApplication)Then
                        app.ActiveDocument.SendCommand "(load ""MyStartUp.lsp"") "
               Set app = Nothing
               StartFlag = False
            End If
        End If
    Loop While (Err.Number <> 429) 'end do1
End Sub

В остальном предложенная метода работает очень надежно, во всяком случае, у меня. Может у кого-нибудь есть еще наблюдения и соображения?