Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: avc от 03-04-2017, 17:35:57

Название: Вызов acedNEntSelPEx в Автокаде 2018
Отправлено: avc от 03-04-2017, 17:35:57
Для поиска объектов под заданной точкой использую вызов 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 ?
Название: Re: Вызов acedNEntSelPEx в Автокаде 2018
Отправлено: Александр Ривилис от 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 *)
Название: Re: Вызов acedNEntSelPEx в Автокаде 2018
Отправлено: avc от 03-04-2017, 19:02:40
Заработало! Спасибо большое.
А не подскажите на будущее, каким средством можно подсмотреть это EntryPoint в дллке? Обычный Листер из Тотал Командера показывает, чтоб есть такая процедура, но не показывает EntryPoint. Осваивать IDA?
Название: Re: Вызов acedNEntSelPEx в Автокаде 2018
Отправлено: Александр Ривилис от 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 *))
Название: Re: Вызов acedNEntSelPEx в Автокаде 2018
Отправлено: avc от 03-04-2017, 20:16:17
Спасибо! Теперь меньше буду задавать глупых вопросов :)