пятница, 30 июля 2010 г.

Немного баловства с Visual Studio и ObjectARX

Был у меня небольшой ARX-модуль для получения списка xref 1-го уровня (непосредственные ссылки чертежа), написанный еще во времена 2006-го автокада из-за того, что через autolisp это решалось несколько коряво. Недавно понадобилось этот модуль перекомпилировать под AutoCAD 2009 x64.


Пока разбирался с наличием у меня 64-битного компилятора в VS 2005, захотелось поэкспериментировать с компиляцией в VS 2008 для 2009го автокада. Как известно, автокад такие ARX, скомпилированные не той версией VC, загрузить не дает. Начал сравнивать, в чем же отличие двух модулей, собранных в VS 2005 и VS 2008 (попутно выкинул из файла CRT, благодаря чему файлик теперь весит 4608 байт).

Для начала FC /b arx_vs2005.arx arx_vs2008.arx > diff.txt
Не вариант - до кучи отличий...
Потом попробовал сравнить дизассемблированный листинг - тут наоборот - файлы практически один в один...
Скачал PE explorer, сравнил заголовки, оказалось все до банального просто: в PE-заголовке есть поле: Linker version. Там значения соответственно 08 и 09.
Открываем файл в WinHex, находим по смещению 0xF2 байт со значением 09 и меняем на 08, сохраняем. Готово. Автокад скушал наш файлик.
Для интересующихся - готовый проект для Visual Studio 2008 с использованием VCBuildHook : pdmxrefs.zip

Дисклаймер:
1) Используйте на свой страх и риск. Не проверялась совместимость при использовании CRT, MFC и прочего.
2) Я не в курсе, является ли смещение 0xF2 постоянным.

Комментариев нет: