12 ноября 2008 г.

Возня с eDrawings

Задачка №2 навела меня на мысль рассказать чуть больше о той программе, в рамках которой она возникла.

У SolidWorkds есть такая вещь как eDrawings Viewer. Смысл его в том, чтобы предоставить унифицированный способ просмотра файлов различных CAD-систем. Т.е. имеется возможность сконвертировать файл в формат eDrawings и показывать его в своей программе. При этом используется стандартный API интерфейс eDrawings. Вроде всё красиво и вкусно - то, что нам было нужно.

Поэтому наши разработчики взяли eDrawings Viewer и интегрировали в наш продукт.

Окей, теперь одной из моих задач было написание интеграции нашего продукта с Pro/ENGINEER Wildfire. В частности, нужно было так, чтобы работал предпросмотр. Примечание: делал я это довольно давно, поэтому в деталях могу наврать. Ладно, скачиваем SDK от eDrawings и погружаемся в изучение.

Во-первых, оказывается, что этот API выполнен в виде ActiveX компонента. Никаких функций в DLL, никаких COM-интерфейсов, никаких .NET сборок - только ActiveX. Ладно, ActiveX, так ActiveX. Попробуем использовать его в лоб. Моя часть должна была быть оформлена в виде DLL, которая вызывается из вспомогательного потока в главном приложении. Главное приложение, кстати, писано на Delphi (т.е. VCL) и его разрабатывал не я, исходных кодов тоже нет - этим занимаются другие люди в совсем другом городе. Ну так вот, мало того, что этот контрол потребовал наличия родительского окна, так он ещё и вис при любом вызове - каким-то макаром он требовал наличия цикла выборки сообщений. Деталей я сейчас уже не помню, но общий смысл был именно таким. Уж я и так и сяк его - не хочет работать где нужно ну ни как. Окей, пишем новое VCL-приложение (тот самый конвертер из задачки №2) с единственной формой, на которую плюхаем этот чёртов контрол. Разумеется, при запуске никакого окна видно не будет - всё происходит в фоне.

В таком варианте уже что-то начало проклёвываться - по крайней мере исходный файлик открывался и конвертировался. Осталось его сохранить. Надо сказать, что у API eDrawings есть две функции сохранения: одна из них вызывает стандартный диалог сохранения, а другая - обычный программный Save As. Угу. Вот только при попытке вызвать этот Save As вылетал Access Violation. Замечательно. Пришлось делать хук на GetSaveFileNameA, вызывать первый вариант функции (с показом диалога пользователю) и вместо показа диалога подсовывать сразу нужное имя файла. Заработало. Уфф.

Но мытарства на этом не кончились. Проблема в том, что на некоторых файлах этот eDrawings показывает MessageBox с единственной кнопкой Ок: типа, этот файл будет конвертирован с потерями. Замечательно. Причём нет никакой опции, чтобы отключить их показ. Я делаю автоматический конвертер без участия человека, а они мне без спросу MessageBox показывают. Ладно, ставим хук на MessageBoxA и просто тупо блокируем его с(с выводом сообщения в лог).

Когда начали у клиента юзать, вылезла ещё одна проблема: очень редко на некоторых файлах конвертер просто встаёт. Причём повторно он этот файл схавает и не подавится. В обычных условиях - проц под 90%, а тут - 0% и не понятно чего ждём. Process explorer показывает внутренности какой-то из функций eDrawings. Ну и что тут прикажете делать? При старте конвертера запустил поток, который раз в секунду замеряет загрузку процессора (не общую, а только для себя) и если она энцать раз подряд меньше 25%, то кикает процесс. Чёрт с ним, пусть не будет превьюхи, но хоть процесс конвертации будет завершён.

И это не говоря уже про глюки клиентской части eDrawings в нашем продукте...

P.S. Кстати, хотя одной функции замера нагрузки процессора нет, но она очень легко делается из GetProcessTimes, а процент загрузки процессора одним потоком - из GetThreadTimes.

3 комментария :

  1. Спасибо!
    Довольно интересно!!!

    ОтветитьУдалить
  2. хотелось бы по-больше узнать о взаимодействии eDrawings и Delphi. Документацию какую-нибудь посмотреть...

    ОтветитьУдалить
  3. Ну, там же ActiveX-контрол, т.е. по барабану, что использовать: Delphi или не Delphi. В Delphi установка ActiveX лежит в районе Component/Import Component/Import ActiveX Control.

    А сам SDK (документация) у них раньше на сайте лежал, а теперь говорят SolidWorks eDrawings 2009 API SDK is available in SolidWorks Installer.

    Да чё там, буквально пять функций у него :D И так разобраться можно.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и (опционально) ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.