Тема: Как закрыть AutoCAD 2007?

Всем привет,
Подскажите плз каким образом можно из своей arx закрыть AUTOCAD 2007.

Re: Как закрыть AutoCAD 2007?

Например, послать команду _QUIT в командную строку.

Re: Как закрыть AutoCAD 2007?

Например, послать команду _QUIT в командную строку.

Попробовал, так не работает :(

acedCommand (RTSTR, _T("_QUIT"), RTNONE);

:( Может я неправильно делаю??

Re: Как закрыть AutoCAD 2007?

У меня и такое не работает :(

acedCommand(RTSTR, "_circle", RTSTR, "10,10",RTSTR, PAUSE,RTSTR, "_line", RTSTR, "10,10", RTSTR, "20,20", RTSTR, "", 0);

Re: Как закрыть AutoCAD 2007?

> Gimli
На личном опыте убедился что 2007 версия малех недоработана. :) Там дублируются команды вызванные с консоли и через acedCommand, поэтому может быть очень непредсказуемый результат. Короче глюкавая она.
Попробуй на 2008. Должно работать.
А вообще-то можно закрыть процесс акада используя стандартные С++ методы :) Но это если ты не ищешь легких путей.

Re: Как закрыть AutoCAD 2007?

> Gimli
Попробуй через acedPostCommand(_T("_QUIT\n"));

Re: Как закрыть AutoCAD 2007?

Попробуй через acedPostCommand(_T("_QUIT\n"));

Такой функции нет. :(

Re: Как закрыть AutoCAD 2007?

> Gimli
А поиском по сайту не пробовал?

Re: Как закрыть AutoCAD 2007?

Заранее извиняюсь за свою бестолковость, но там ссылки на использование этой функции. У меня же просто компилятор ругается: 'acedPostCommand': identifier not found. Или вы имели ввиду использование этого:

    
CString StrToExec;
StrToExec.Append(_T("_QUIT\n"));
acDocManager->sendStringToExecute(acDocManager->curDocument(),StrToExec.GetBuffer(),false,true);
StrToExec.ReleaseBuffer();

Так тоже не работает.

Re: Как закрыть AutoCAD 2007?

> Gimli
Я имел в виду:

int acedPostCommand(wchar_t const *str);

Вставь это описание и попробуй. Еще можно послать главному окну AutoCAD WM_CLOSE:

PostMessage(adsw_acadMainWnd(), WM_CLOSE, 0, 0);

Re: Как закрыть AutoCAD 2007?

Пробовал следующее:
1) acedPostCommand(_T("_QUIT\n")). Не работает.
В окне Автокада выводит:
Файл настройки загружен успешно. Группа настройки: ACAD
Файл настройки загружен успешно. Группа настройки: CUSTOM
Выполняется регенерация модели.
_QUIT
Утилиты меню AutoCAD загружены.
Команда: КОМСТР

2) Пробовал слать мессаджи
так:

    CWnd* pAcadWnd = CWnd::FromHandle(adsw_acadMainWnd());
    pAcadWnd->SendMessage(WM_DESTROY,0,0);

WM_DESTROY рушит акад с exeption.
WM_CLOSE никакого эффекта.

Re: Как закрыть AutoCAD 2007?

PostMessage(adsw_acadMainWnd(), WM_CLOSE, 0, 0);

Выводит при загрузке arx:

Файл настройки загружен успешно. Группа настройки: ACAD
Файл настройки загружен успешно. Группа настройки: CUSTOM
Выполняется регенерация модели.
_QUIT
Утилиты меню AutoCAD загружены._quit
Команда: КОМСТР

Видимо не так то просто его прикрыть.

Re: Как закрыть AutoCAD 2007?

> Gimli
Не понял. Ты пытаешься закрыть AutoCAD при его загрузке? Зачем?

Re: Как закрыть AutoCAD 2007?

Мне необходимо открыть Акад считать настройки слоев из ини файла, создать слои, тоже самое для текстовых стилей. Затем сохранить этот файл как dwg и закрыть Акад. Кроме закрытия автокада я все сделал.

Re: Как закрыть AutoCAD 2007?

> Gimli
Я не понял:
1) как ты запускаешь AutoCAD
2) Из какого контекста (случайно не из On_kInitAppMsg)?
3) И вообще приведи свой код, а то идет гадание на кофейной гуще...

Re: Как закрыть AutoCAD 2007?

extern "C" __declspec(dllexport)
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* p)
{
    switch( msg )
    {
    case AcRx::kInitAppMsg:
        acrxRegisterAppMDIAware(p);
        [b]startCreating();[/b]
        break;
    case AcRx::kUnloadAppMsg:
        break;
    default:
        break;
    }
    return AcRx::kRetOK;
}
void startCreating()
{
...
createLayer( nameLayer, keyVal, layerId );// здесь создаются слои
....
createTextStyle(nameStyle, keyVal, styleId);// здесь создаются текстовые стили
....
AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
if ( pDb )
{
 pDb->saveAs(_T(""C:\\test.dwg";"));
}
acedPostCommand(_T("_QUIT\n")); // не работает
    
}

Автокад запускаю пока через стандартные настройки в проекте. Планирую запускать через ShellExecute из своего приложения.

Re: Как закрыть AutoCAD 2007?

> Gimli
Так я и понял про InitAppMsg. В этом контексте нельзя работать с чертежом. В этот момент AutoCAD еще не полностью инициализирован.

Re: Как закрыть AutoCAD 2007?

А как правильно подскажите плз.

Re: Как закрыть AutoCAD 2007?

попробовал так:

    case AcRx::kLoadDwgMsg:
        startCreating();

тот же еффект

Re: Как закрыть AutoCAD 2007?

Пробовал еще так:

case AcRx::kLoadDwgMsg:
{
try
{
CoInitialize(NULL);
AutoCAD::IAcadApplicationPtr pAcad;
HRESULT hr = NOERROR;
CLSID clsid;
LPUNKNOWN pUnk = NULL;
LPDISPATCH pAcadDisp = NULL;
CLSIDFromProgID( L"AutoCAD.Application", &clsid );
GetActiveObject(clsid, NULL, &pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pAcadDisp);
hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication, (void**)&pAcad);
pAcad->Quit();
pUnk->Release();
pAcadDisp->Release();
}

Возвращает pUnk нулевой. :(

Re: Как закрыть AutoCAD 2007?

Вопрос решил, всем спасибо.