Тема: Определить разрядность AutoCAD

Существует ли "железобетонный" способ (желательно не через рееестр) узнать разрядность AutoCAD (не архитектуру процессора, не разрядность ОС).

Собственно, это в продолжение темы https://www.caduser.ru/forum/post270855.html#p270855. У клиента работает как раз функция для Win32. ОС у него стопудово Win7 x64. Клиент божится, что AutoCAD 64-х разрядный. Понятно, что чудес небывает и, что "все врут", но проверить-то надо.

Re: Определить разрядность AutoCAD

Вот тут и тут вроде об этом..

Re: Определить разрядность AutoCAD

bender пишет:

Клиент божится, что AutoCAD 64-х разрядный. Понятно, что чудес небывает и, что "все врут", но проверить-то надо.

Уточни у него версию AutoCAD и локализацию. AutoCAD до 2007 включительно был только 32-разрядный. AutoCAD 2008 English был и 32 и 64-разрядный, а русский только 32-разрядный, но его хитрым образом можно было установить и на 64-разрядную OS. При этом он оставался 32-разрядным. Версии выше все были все 32 и 64-разрядные. Хотя наверное извращенным способом IMHO можно было установить 32-разрядные их версии на 64-разрядную OS.

Re: Определить разрядность AutoCAD

AutoCAD 2008 Rus. Поставить можно, проверено  :D И работать будет.

Re: Определить разрядность AutoCAD

AlexV

Это видел.

1. Через реестр. Не хочется (да и мутно там...).
2. Ну вот как раз так-то и не срастается.

Re: Определить разрядность AutoCAD

bender пишет:

2. Ну вот как раз так-то и не срастается.

Ты про это:

Из .NET-приложения загруженного в AutoCAD разрядность определяется просто (т.к. нельзя загрузить 32-разрядную сборку в 64-разрядный AutoCAD и наоборот):

string platform = IntPtr.Size == 4 ? "x86" : "x64";

:?:

Re: Определить разрядность AutoCAD

Ага

Re: Определить разрядность AutoCAD

bender пишет:

Ага

Вот тут как раз чудес не бывает. Конечно если речь идет о .NET-сборке, которая грузится внутрь AutoCAD.

Re: Определить разрядность AutoCAD

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

Вот тут как раз чудес не бывает. Конечно если речь идет о .NET-сборке, которая грузится внутрь AutoCAD.

Понимаю. Хотелось узнать, если еще какой-нибудь способ проверить. Будем разбираться с клиентом...

(изменено: Александр Ривилис, 30 ноября 2010г. 09:47:34)

Re: Определить разрядность AutoCAD

Пусть проверит этот вариант:

(defun Acad64Bit-version ()
  (vl-load-com)
  (> (strlen (vl-prin1-to-string (vlax-get-acad-object))) 40)
)

P.S.: Т.к. у него AutoCAD 2008 Russian, то он однозначно 32-разрядный. Если это не какой-нибудь "самопал" из английской версии.

Re: Определить разрядность AutoCAD

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

Пусть проверит этот вариант:

(defun Acad64Bit-version ()
  (vl-load-com)
  (> (strlen (vl-prin1-to-string (vlax-get-acad-object))) 40)
)

Да, я уже думал над этим вариантом. Тут хотелось бы понять, почему если длина "наименования" объекта АКАДа больше 40 символов, то он 64-х разрядный? Это "шаманский" прием, или где-то описано?

Re: Определить разрядность AutoCAD

Ты не дочитал: http://blog.jtbworld.com/2007/04/determ … tocad.html

vlax-get-acad-object in 64-bit return a longer object ID number than in the 32-bit so the function Acad64Bit-version will return T if AutoCAD is a 64-bit version.

Re: Определить разрядность AutoCAD

Хотелось бы узнать, почему не нравится способ

string platform = IntPtr.Size == 4 ? "x86" : "x64";

Результат "железобетонный" однозначно, поскольку если acad.exe 32х разрядный, то и CLR в него загружена 32х разрядная, а значит и длина указателя (IntPtr) 4 байта.

(изменено: bender, 30 ноября 2010г. 10:23:06)

Re: Определить разрядность AutoCAD

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

Ты не дочитал: http://blog.jtbworld.com/2007/04/dete...tocad.html

vlax-get-acad-object in 64-bit return a longer object ID number than in the 32-bit so the function Acad64Bit-version will return T if AutoCAD is a 64-bit version.

Да нет, это я читал. Меня заинтересовало, это что, кто-то "экспериментально" определил? Или где-то в документации почитать можно? Почему именно 40?

Пастух пишет:

Хотелось бы узнать, почему не нравится способ

string platform = IntPtr.Size == 4 ? "x86" : "x64";

Результат "железобетонный" однозначно, поскольку если acad.exe 32х разрядный, то и CLR в него загружена 32х разрядная, а значит и длина указателя (IntPtr)  4 байта .

Почему не нравится? Нравится. Хотелось узнать, какие еще варианты имеются.

Re: Определить разрядность AutoCAD

А что тогда означает

Ну вот как раз так-то и не срастается.

Re: Определить разрядность AutoCAD

Пастух пишет:

А что тогда означает

Ну вот как раз так-то и не срастается.

Ну так я жеж писал

Клиент божится, что AutoCAD 64-х разрядный. Понятно, что чудес небывает и, что "все врут", но проверить-то надо.

Значит точно - врет (или не знает) => все сделано правильно.

Re: Определить разрядность AutoCAD

bender пишет:

Да нет, это я читал. Меня заинтересовало, это что, кто-то "экспериментально" определил? Или где-то в документации почитать можно? Почему именно 40?

Ну ты и ленивый. А самому посмотреть, что выдает (vl-prin1-to-string (vlax-get-acad-object)) и посчитать количество байт?

Command: (vl-load-com)
Command: (vl-prin1-to-string (vlax-get-acad-object)) "#<VLA-OBJECT IAcadApplication 00d74d3c>"
Command: (strlen (vl-prin1-to-string (vlax-get-acad-object))) 39

Адрес в 32-разрядной системе в 16-ричной системе счисления занимает 4 байта, а в 64-разрядной - 8 байт. Поэтому длина строки будет > 40.

Re: Определить разрядность AutoCAD

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

Ну ты и ленивый. А самому посмотреть, что выдает (vl-prin1-to-string (vlax-get-acad-object)) и посчитать количество байт?

Чё это? Смотрел, считал. А вот до этого не допёр.

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

Адрес в 32-разрядной системе в 16-ричной системе счисления занимает 4 байта, а в 64-разрядной - 8 байт. Поэтому длина строки будет > 40.

Туплю. Спсб.

Re: Определить разрядность AutoCAD

Да и прошу прощенья. Вот это вот

bender пишет:

AutoCAD 2008 Rus.

был неправ, не в ту сторону смотрел. У клиента AutoCAD 2010 Rus (точнее AutoCAD Architecture).

Re: Определить разрядность AutoCAD

bender пишет:

У клиента AutoCAD 2010 Rus (точнее AutoCAD Architecture).

Тогда с вероятностью 99.9% он x64. Но тогда в контексте https://www.caduser.ru/forum/post270855.html#p270855 как минимум "acdb17.dll" нужно заменить на "acdb18.dll". Да и строка EntryPoint:="..." может отличаться - нужно проверять.

Re: Определить разрядность AutoCAD

Щас разбираемси... Отпишусь. Я или очень тупой, или чего-то не то...

(изменено: bender, 30 ноября 2010г. 13:35:25)

Re: Определить разрядность AutoCAD

Все разобрались, наконец-то... В трех соснах заблудились, блин. У клиента все работает так, как и положено. В х32 - функция для х32, в х64 - для х64. Проблемы с удаленной коммуникацией  :oops:

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

Тогда с вероятностью 99.9% он x64. Но тогда в контексте https://www.caduser.ru/forum/post270855.html#p270855 как минимум "acdb17.dll" нужно заменить на "acdb18.dll". Да и строка EntryPoint:="..." может отличаться - нужно проверять.

Там "acdb18.dll", копировал не из "того" проекта. Описание этой функции у них одинаковое.

Re: Определить разрядность AutoCAD

bender пишет:

Проблемы с удаленной коммуникацией smile:oops:

Так в чем же была проблема?

Re: Определить разрядность AutoCAD

В недопонимании. Там просто достаточно много компьютеров, на разных ОС, с разными АКАДами. Я спрашивал про одно, отвечали про другое. Ну где-то так: "Работает?" - "Работает." "Со старыми программами?" - "Со старыми."   :o  "Везде обновили?" - "Нет, только на новом."   :evil:  В результате обновили программы на всех компьютерах и все встало на свои места. Работает и на 32-х и на 64-х разрядных АКАДах.

Еще раз спасибо за ответы.