22.07.2015, 18:02 | #1 |
Участник
|
Ax2009 Работа с dll
Цель - у меня есть библиотека с кучей функций.
Одна из функций на вход получает период накладных и должна вернуть списком номер и даты накладных за период. Читаю документацию https://msdn.microsoft.com/en-US/lib...(v=ax.50).aspx Возникли вопросы (писала в коде) X++: static void importOle(Args _args) { DLL dllOle = new DLL("dLLOLE.dll");//определяем название dll - она должна лежать в Bin клиента //1. если клиент стоит на клиентских машинах, то необходимо его туда копировать? //2. можно ли написать полный путь на сервер к библиотеке? DLLFunction dllFunction = new DLLFunction(dllOle,"FunctionName"); ; dllFunction.returns(ExtTypes::DWord);//3. Это типы возвращаемых значений? dllFunction.arg(ExtTypes::DWord);//4. Это определение типов переменных на вход в функцию? dllFunction.call('Value'); //5. Это передача значений переменных в функцию и результата запроса? //6. каким образом получить данные, если возвращается много строк? Например, номера накладных и их дат за период //7. каким образом получить две переменные, возвращаемые функцией? } Последний раз редактировалось Arahnid; 22.07.2015 в 18:13. |
|
22.07.2015, 19:36 | #2 |
Участник
|
странная цель у вас
|
|
22.07.2015, 19:39 | #3 |
Administrator
|
Цитата:
Сообщение от Arahnid
Цель - у меня есть библиотека с кучей функций.
Одна из функций на вход получает период накладных и должна вернуть списком номер и даты накладных за период. Читаю документацию https://msdn.microsoft.com/en-US/lib...(v=ax.50).aspx Возникли вопросы (писала в коде) X++: static void importOle(Args _args) { DLL dllOle = new DLL("dLLOLE.dll");//определяем название dll - она должна лежать в Bin клиента //1. если клиент стоит на клиентских машинах, то необходимо его туда копировать? //2. можно ли написать полный путь на сервер к библиотеке? DLLFunction dllFunction = new DLLFunction(dllOle,"FunctionName"); ; dllFunction.returns(ExtTypes::DWord);//3. Это типы возвращаемых значений? dllFunction.arg(ExtTypes::DWord);//4. Это определение типов переменных на вход в функцию? dllFunction.call('Value'); //5. Это передача значений переменных в функцию и результата запроса? //6. каким образом получить данные, если возвращается много строк? Например, номера накладных и их дат за период //7. каким образом получить две переменные, возвращаемые функцией? } 1. Если Вы сами кладете dll в Bin клиента - то да, надо копировать. Есть семейство классов SysFileDeployment - они как раз занимаются тем, что копируют с сервера на клиент dll-ку при старте АХ. Т.е. dll-ка изначально кладется на сервер (кажется в Bin сервера), а каждый клиент при старте себе ее забирает и кладет в Bin клиента. Единственное - какие тут могут быть грабли - это "защита" Windows, начиная с Vista от копирования в Program Files. Тут нужно тестировать права. 2. Помню, что в старых версиях как-то не получилось с ходу прописать путь, вышли в результате на классы SysFileDeployment и решили, что именно этот вариант реализуем в АХ (т.е. когда dll-ка лежит в строго обозначенном каталоге). Если кто-то знает решение - то будет здорово. 3,4. Да 5. Да, но тут еще может использоваться тип COMVariant и соответственно - может потребоваться преобразование типов 6,7. Нужно смотреть - что за тип возвращает dll-ка. Базовые типы везде одинаковы (и то с той же датой или дробным числом могут быть заморочки). А вот если dll-ка умеет возвращать много строк - значит она возвращает некий объект. В этом случае - надо думать, как этот объект можно передать в АХ. Как вариант - массив Array. Но в идеале - если dll-ка связана с .NET - то попробовать использовать .net-овские типы / объекты. Например, в АХ 2012 своеобразным паттерном (шаблоном) является использование класса-контракта. Т.е. функция возвращает объект (класс), который АХ "распознает", как класс. И у этого класса количество parm-методов соответствует требуемому количеству возвращаемых Вам значений
__________________
Возможно сделать все. Вопрос времени |
|
23.07.2015, 08:22 | #4 |
Участник
|
X++: DLL dllOle = new DLL("dLLOLE.dll"); Если она действительно связана с OLE, то надо предварительно сделать ее регистрацию с помощью regsvr32, а затем использовать класс Com в Аксапте для доступа к ее функционалу (можно воспользоваться мастером COM Class Wrapper) Если dll является сборкой .net, то необходимо добавить ее в узел References в AOT и после этого использовать экспортируемые ей классы в коде в Акс напрямую Если же это "обычная" dll, экспортирующая функции, то надо разбираться в сигнатурах этих методов и что именно они возвращают Изучать работу с такими dll в Аксапте можно с помощью класса WinAPI - в нем реализовано много подходов для доступа к таким функциям
__________________
Axapta v.3.0 sp5 kr2 |
|
23.07.2015, 09:04 | #5 |
Участник
|
Добрый день!
На моем опыте делали так: Для регистрации dll в <ASM> - path gacutil –I имя.dll Далее можно подключить dll AOT\references\добавить ссылку - dll C уважением, Дмитрий |
|
23.07.2015, 09:49 | #6 |
Участник
|
Цитата:
Цитата:
Цитата:
В данном случае, вопросы к нам не совсем верные, т.к. все зависит от того, каким образом эти значения возвращает Ваша функция. А мы это сказать не сможем до тех пор, пока не увидим определение этой волшебной функции. В WinAPI обычно множество значений из функции получают при помощи указателя на структуру/массив/список и т.д., который передается в функцию одним из параметров. Как это реализовано у Вас - для нас загадка. |
|
23.07.2015, 11:15 | #7 |
Участник
|
Библиотека Ole.
Это описание одной из функций. Мне не понятно из такого описания в реальности что возращается, но могу предположить, что перечисленные поля. { Расходная накладная } function Doc4 ( RID, OPTION: integer ): integer; safecall; // Битовая маска опций накладной DocRec::Options. //В DocList значение поля (1.103.11.1) 1.103.3.1 Дата накладной 1.103.4.1 Строковая часть номера накладной 1.103.5.1 Числовая часть номера накладной 1.103.11.1 Битовая маска опций накладной DocRec::Options 1.103.10.1 Тип накладной DocRec::Type 1.103.2.1 Младшее слово стампа даты накладной 1.102.1.2 Ключ (Rid) корреспондента-поставщика 1.102.4.2 Наименование корреспондента-поставщика 1.102.1.3 Ключ (Rid) корреспондента-получателя 1.102.4.3 Наименование корреспондента-получателя 1.102.1.5 Ключ (Rid) отв. лица "Принял" 1.102.4.5 Имя отв. лица "Принял" 1.107.1.9 Ключ (Rid) бух.операции 1.107.2.9 Наименование бух.операции 110.1.10 Тип счета фактуры 1.102.1.4 Ключ (Rid) отв. лица "Отпустил" 1.102.4.4 Имя отв. лица "Отпустил" 110.3.10 Дата счета-фактуры 1.100.1.6 Ключ (Rid) валюты документа 1.103.12.0 Курс в базовой валюте (секция "Курс: столько-то RBL за столько-то " 1.103.13.0 Курс в валюте накладной (секция "Курс: столько-то RBL за столько-т" 1.100.3.6 Код валюты документа 1.103.15.0 Примечение 1.0.1.7 история: дата создания 1.0.2.7 история: время создания в секундах 1.0.3.7 история: дата последнего изменения 1.0.4.7 история: время последнего изменения в секундах 1.0.5.7 история: мин. дата активного док-та 1.0.6.7 история: пользователь, создавший накладную 1.0.7.7 история: не использовать 2.105.1.1 Ключ (Rid) записи 2.210.1.1 Ключ (Rid) товара 2.206.1.1 Ключ (Rid) единицы измерения 2.210.3.1 Текстовая часть кода товара 2.210.4.1 Числовая часть кода товара 2.210.2.1 Наименование товара 2.206.2.1 Наименование единицы измерения 2.105.3.0 Количество товара 2.105.15.1 Опции записи DocSpecRec::Options 2.105.14.0 Альтернативная дата для рассчета курса небазовой валюты (только п/н) 2.105.4.0 Сумма б/н 2.212.2.0 Ставка/сумма НДС (в зависимости от DocSpecRec::Options) 2.213.2.0 Ставка/сумма НСП (в зависимости от DocSpecRec::Options) Последний раз редактировалось Arahnid; 23.07.2015 в 11:30. |
|
23.07.2015, 11:23 | #8 |
Участник
|
Цитата:
Сообщение от AndyD;319991
Если она действительно связана с OLE, то надо предварительно сделать ее регистрацию с помощью [URL="https://support.microsoft.com/ru-ru/kb/249873" regsvr32[/URL], а затем использовать класс Com в Аксапте для доступа к ее функционалу (можно воспользоваться мастером COM Class Wrapper)
А где в коде можно посмотреть уже какой-то реализованный функционал с помощью COM Class Wrapper? Последний раз редактировалось Arahnid; 23.07.2015 в 11:29. |
|
23.07.2015, 15:14 | #9 |
Участник
|
Если это действительно библиотека OLE, то она должна экспортировать COM-объекты, а не набор функций (точнее, dll то, понятно, экспортирует функции, но правильно работать они должны в составе COM-объекта).
Цитата:
Кстати, спецификация вызова safecall также намекает, что смотреть нужно в сторону COM. В общем, ничего не прояснилось. |
|
23.07.2015, 15:43 | #10 |
Участник
|
спасибо, буду дергать того, кто дал описание
|
|
27.07.2015, 07:46 | #11 |
Участник
|
Цитата:
Сообщение от sukhanchik
1. Если Вы сами кладете dll в Bin клиента - то да, надо копировать. Есть семейство классов SysFileDeployment - они как раз занимаются тем, что копируют с сервера на клиент dll-ку при старте АХ. Т.е. dll-ка изначально кладется на сервер (кажется в Bin сервера), а каждый клиент при старте себе ее забирает и кладет в Bin клиента. Единственное - какие тут могут быть грабли - это "защита" Windows, начиная с Vista от копирования в Program Files. Тут нужно тестировать права.
|
|
Теги |
dll, dllfunction |
|
Похожие темы | ||||
Тема | Ответов | |||
Ax3 and Win2008 для печати | 13 | |||
MSDAX 4.0 и планировщик win server 2008 | 11 | |||
Установка Ax2009 на локалку | 23 | |||
при вызове функции из своей DLL, вылетает ошибка | 9 | |||
работа с wininet.dll | 8 |
|