Тема: Программное завершение приложения ARX

Возможно ли изнутри ARX приложения его же завершить
Идея такая у меня программа выполняет все необходимые действия ещё при загрузке приложения, в том числе и производит очищение памяти после себя... остается только завершить приложение.
Например, команда ARXUnload в консоли автокада. Либо просто закрытие окна автокада. А возможно ли чтобы программа выполняла все необходимые действия, у тут же завершалась...

Re: Программное завершение приложения ARX

Можешб послать комаду (arxunload "свое приложние") - это можно сделать массой различных способов. В любом случае команда выполнится после завершения текущей команды. Вот онесколько ссылок где можно найти решение:
https://www.caduser.ru/forum/topic31519.html
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=15148C

Re: Программное завершение приложения ARX

более правильно использовать:
acrxDynamicLinker->unloadModule

Re: Программное завершение приложения ARX

> Shedever
Или ты не внимательно прочитал вопрос и ответ на него, или ты ничего не понял. Речь идет о выгрузке из arx-файла самого себя. acrxDynamicLinker->unloadModule() в этом случае не может помочь. Если не веришь на слово - проверь:

//----------------------------------------------------------------
// Функция по полному пути к arx/dbx-модулю возвращает имя модуля
// пригодное для acrxDynamicLinker->unloadModule или NULL
// если такой модуль не загружен
//----------------------------------------------------------------
static ACHAR *getThisLoadedName(ACHAR *path)
{
  resbuf *rb = acedArxLoaded(), *rb_start = rb;
  for (; rb ; rb = rb->rbnext) {
    HMODULE hRb = GetModuleHandle(rb->resval.rstring);
    ACHAR rbPath[_MAX_PATH+1]=""; GetModuleFileName(hRb,rbPath,_MAX_PATH);
    if (!AcString(path).compareNoCase(rbPath)) {
      ACHAR *str = strdup(rbPath);
      acutRelRb(rb_start);
      return str;
    }
  }
  acutRelRb(rb_start);
  return NULL;
}
// - Arx.SELFUNLOAD command (do not rename)
static void ArxSELFUNLOAD(void)
{
  ACHAR thispath[_MAX_PATH+1]="";
  GetModuleFileName(_hdllInstance,thispath,_MAX_PATH);
  acutPrintf(_T("\nПопытка выгрузить %s"),thispath);
  ACHAR *path = getThisLoadedName(thispath);
  if (path) {
    acutPrintf(_T("\nПредпринимается попытка выгрузить %s"), path);
    acutPrintf(_T("\nРезультат %s!!!"), acrxDynamicLinker->unloadModule(path)?_T("положительный"):_T("отрицательный"));
    free(path); path = getThisLoadedName(thispath);
    // Если path != NULL - значит модуль не выгрузился!!!
    if (path) {
      acutPrintf(_T("\nНо модуль не выгрузился!!!"));
      free(path);
    }
  }
}

P.S.: И на будущее. Если делаешь категоричные выводы:

более правильно использовать:

- подтверждай их примерами.

Re: Программное завершение приложения ARX

Признаюсь, погорячился с acrxDynamicLinker->unloadModule..исправляю свою ошибку !
Это выгружает, проверно на 100%, только после этого надо return сразу делать!
#define UNLOAD_STRING "arx unload floorplan.arx\n"
    COPYDATASTRUCT cmdMsg  = { 1, sizeof(UNLOAD_STRING),(void*)UNLOAD_STRING };
    ::SendMessage(adsw_acadMainWnd(), WM_COPYDATA, (WPARAM)adsw_acadMainWnd(), (LPARAM)&cmdMsg);
return;

Re: Программное завершение приложения ARX

а ваша Александр функция выгружать не хочет,
"Результать положительный"
"Но модуль не выгрузился!"
зато какие слова вы произнесли,, "похлопаем"!!

Re: Программное завершение приложения ARX

и после вашей функции Autocad не хочет реагировать на arx unload app.arx,
вежливо сообщая, что
"приложение не может быть выгружено, потому что на него ссылаются другие приложения"

Re: Программное завершение приложения ARX

> Shedever
Еще раз только внимательно прочитай то, что я написал. Я привел тестовый пример только для того, чтобы показать, что при помощи acrxDynamicLinker->unloadModule() нельзя выгрузить "самого себя". То что я написал в самом первом ответе == тому что предложено тобой с при помощи SendMessage. Разница лишь в том, что я предожил это сделать не при помощи команды, а при помощи lisp-функции, что правильнее, т.к. в зависимости от состояния ситемных переменных команда может не выполнится(!)

> Shedever
Считай это одним из вариантов кода, который позволит создать невыгружаемое приложение. :)

Re: Программное завершение приложения ARX

ну, может и этому можно будет найти применение!

Re: Программное завершение приложения ARX

P.S.: Если воспользоваться ads_queueexpr то return сразу делать необязательно. Выгрузка произойдет сразу после завершения команды AutoCAD, которая эту функцию выполнила.

Re: Программное завершение приложения ARX

не вижу я такой функции "ads_queueexpr"

Re: Программное завершение приложения ARX

да и SendMessage тоже выгружает, после выполнения команды,, если после ее вызова появится модальный диалог, то выгрузка отложится до его закрытия...а return просто ускоряет этот процесс

Re: Программное завершение приложения ARX

Shedever пишет:

не вижу я такой функции "ads_queueexpr"

И не увидишь. :) Это недокументировнная функция. Пройдись по ссылкам, которые я привел в первом сообщении - найдешь ее описание и примеры использования.