Вызов acedNEntSelPEx в Автокаде 2018

Автор Тема: Вызов acedNEntSelPEx в Автокаде 2018  (Прочитано 3851 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Для поиска объектов под заданной точкой использую вызов acedNEntSelPEx из accore.dll.
Код - C# [Выбрать]
  1.     [DllImport("accore.dll", EntryPoint = "?acedNEntSelPEx@@YAHPB_WQAJQANHQAY03NPAPAUresbuf@@IPAH@Z", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  2.     private static extern int acedNEntSelPEx2013x32(string prompt, long[] adsname, out Point3d picked, int pickflag, out Matrix3d transform, out IntPtr resbuf, uint transSpaceFlag, out int gsMarker);
  3.  
  4.     [DllImport("accore.dll", EntryPoint = "?acedNEntSelPEx@@YAHPEB_WQEA_JQEANHQEAY03NPEAPEAUresbuf@@IPEA_J@Z", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  5.     private static extern int acedNEntSelPEx2013x64(string prompt, long[] adsname, out Point3d picked, int pickflag, out Matrix3d transform, out IntPtr resbuf, uint transSpaceFlag, out int gsMarker);
  6.  
  7. вызывал так:
  8.           if (IntPtr.Size == 4)
  9.             result = acedNEntSelPEx2013x32("", adsname, out Picked, pickflag, out Transform, out resbuf, transSpaceFlag, out GSMarker);
  10.           else
  11.             result = acedNEntSelPEx2013x64("", adsname, out Picked, pickflag, out Transform, out resbuf, transSpaceFlag, out GSMarker);

Все работало во всех версиях Автокада начиная с 2013. Но сегодня обнаружил, что вызов не работает в 32х разрядном AutoCAD 2018. Выталкивает исключение "Unable to find an entry point named '?' in DLL 'accore.dll'."  В x64 проблем нет.
Что-то поменялось в accore ?

Отмечено как Решение avc 03-04-2017, 19:02:46

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов acedNEntSelPEx в Автокаде 2018
« Ответ #1 : 03-04-2017, 18:40:54 »
Похоже так:
Код - C# [Выбрать]
  1.    
  2. [DllImport("accore.dll", EntryPoint = "?acedNEntSelPEx@@YAHPB_WQAHQANHQAY03NPAPAUresbuf@@IPAH@Z", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  3.     private static extern int acedNEntSelPEx2013x32(string prompt, long[] adsname, out Point3d picked, int pickflag, out Matrix3d transform, out IntPtr resbuf, uint transSpaceFlag, out int gsMarker);
  4.     [DllImport("accore.dll", EntryPoint = "?acedNEntSelPEx@@YAHPEB_WQEA_JQEANHQEAY03NPEAPEAUresbuf@@IPEA_J@Z", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  5.     private static extern int acedNEntSelPEx2013x64(string prompt, long[] adsname, out Point3d picked, int pickflag, out Matrix3d transform, out IntPtr resbuf, uint transSpaceFlag, out int gsMarker);
  6.  
И в 2017 тоже. А вот в 2016 и раньше EntryPoint для x32 такой, как у тебя.

Отличие в описании функций для 2016 и 2017, 2018:
Код - C++ [Выбрать]
  1. /* 2017 */ int __cdecl acedNEntSelPEx(wchar_t const *,int * const,double * const,int,double (* const)[4],struct resbuf * *,unsigned int,int *);
  2. /* 2016 */ int __cdecl acedNEntSelPEx(wchar_t const *,long * const,double * const,int,double (* const)[4],struct resbuf * *,unsigned int,int *);
(второй параметр был long *, а стал int *)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Вызов acedNEntSelPEx в Автокаде 2018
« Ответ #2 : 03-04-2017, 19:02:40 »
Заработало! Спасибо большое.
А не подскажите на будущее, каким средством можно подсмотреть это EntryPoint в дллке? Обычный Листер из Тотал Командера показывает, чтоб есть такая процедура, но не показывает EntryPoint. Осваивать IDA?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов acedNEntSelPEx в Автокаде 2018
« Ответ #3 : 03-04-2017, 19:28:00 »
А не подскажите на будущее, каким средством можно подсмотреть это EntryPoint в дллке? Обычный Листер из Тотал Командера показывает, чтоб есть такая процедура, но не показывает EntryPoint. Осваивать IDA?
У меня вообще нет AutoCAD 2018-го 32-битного, а качать инсталляцию целиком и из неё вытаскивать accore.dll мне было не с руки. Зато есть ObjectARX SDK 2018. При помощи утилиты (из VS) я получил дамп экспортируемых функций:
dumpbin /exports accore.lib > accore.txtнашёл строку acedNEntSelPEx  и увидел (для x32):
Цитировать
?acedNEntSelPEx@@YAHPB_WQAHQANHQAY03NPAPAUresbuf@@IPAH@Z (int __cdecl acedNEntSelPEx(wchar_t const *,int * const,double * const,int,double (* const)[4],struct resbuf * *,unsigned int,int *))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Вызов acedNEntSelPEx в Автокаде 2018
« Ответ #4 : 03-04-2017, 20:16:17 »
Спасибо! Теперь меньше буду задавать глупых вопросов :)