AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.07.2015, 18:02   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
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  
Vasiliy Petrovich is offline
Vasiliy Petrovich
Участник
 
83 / 17 (1) ++
Регистрация: 26.06.2015
странная цель у вас
Старый 22.07.2015, 19:39   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,314 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от 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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
X++:
DLL dllOle = new DLL("dLLOLE.dll");
"Говорящее" название 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  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
Добрый день!
На моем опыте делали так:
Для регистрации dll в <ASM> - path gacutil –I имя.dll

Далее можно подключить dll AOT\references\добавить ссылку - dll

C уважением, Дмитрий
Старый 23.07.2015, 09:49   #6  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Одна из функций на вход получает период накладных и должна вернуть списком номер и даты накладных за период.
Если есть "одна из функций", то почему бы не написать ее определение сюда?

Цитата:
Сообщение от Arahnid Посмотреть сообщение
X++:
    DLL dllOle = new DLL("dLLOLE.dll");//определяем название dll - она должна лежать в Bin клиента
    //1. если клиент стоит на клиентских машинах, то необходимо его туда копировать?
    //2. можно ли написать полный путь на сервер к библиотеке?
Если речь идет о классической Win DLL, то она должна лежать там, где её сможет найти и загрузить Windows при вызове WinAPI функции загрузки dll - в папке приложения (клиента или AOS), в папках Windows или в других доступных для системы папок (PATH). А клиент это или сервер - все зависит от того, где будет выполнятся код X++, загружающий dll.

Цитата:
Сообщение от Arahnid Посмотреть сообщение
X++:
...
    dllFunction.returns(ExtTypes::DWord);//3. Это типы возвращаемых значений?
...
    dllFunction.call('Value'); //5. Это передача значений переменных в функцию и результата запроса?
Метод call класса DLLFunction осуществляет вызов описанной функции DLL. В качестве параметров в этот метод надо передать параметры функции, "описанные" выше вызовом arg, при этом типы и порядок переданных параметров должны соответствовать тому, что было указано в arg, ну и параметрам функции, само собой. Метод возвратит одно единственное значение, то которое возвратит описанная функция, при этом тип этого значения будет тем, который указан с помощью метода returns, и он также должен соответствовать типу возвращаемого значения функции.

Цитата:
Сообщение от Arahnid Посмотреть сообщение
X++:
    //6. каким образом получить данные, если возвращается много строк? Например, номера накладных и их дат за период
    //7. каким образом получить две переменные, возвращаемые функцией?
В данном случае, вопросы к нам не совсем верные, т.к. все зависит от того, каким образом эти значения возвращает Ваша функция. А мы это сказать не сможем до тех пор, пока не увидим определение этой волшебной функции. В WinAPI обычно множество значений из функции получают при помощи указателя на структуру/массив/список и т.д., который передается в функцию одним из параметров. Как это реализовано у Вас - для нас загадка.
Старый 23.07.2015, 11:15   #7  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Библиотека 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  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Цитата:
Сообщение от 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  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Библиотека Ole.
Если это действительно библиотека OLE, то она должна экспортировать COM-объекты, а не набор функций (точнее, dll то, понятно, экспортирует функции, но правильно работать они должны в составе COM-объекта).

Цитата:
Сообщение от Arahnid Посмотреть сообщение
Это описание одной из функций. Мне не понятно из такого описания в реальности что возращается, но могу предположить, что перечисленные поля.
Из описания только понятно, что эта функция принимает два целочисленных параметра и возвращает так же целое число. Остальное - список каких-то "ip адресов", а куда и как их применить - из этого описания не понятно.

Кстати, спецификация вызова safecall также намекает, что смотреть нужно в сторону COM.

В общем, ничего не прояснилось.
Старый 23.07.2015, 15:43   #10  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
спасибо, буду дергать того, кто дал описание
Старый 27.07.2015, 07:46   #11  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
1. Если Вы сами кладете dll в Bin клиента - то да, надо копировать. Есть семейство классов SysFileDeployment - они как раз занимаются тем, что копируют с сервера на клиент dll-ку при старте АХ. Т.е. dll-ка изначально кладется на сервер (кажется в Bin сервера), а каждый клиент при старте себе ее забирает и кладет в Bin клиента. Единственное - какие тут могут быть грабли - это "защита" Windows, начиная с Vista от копирования в Program Files. Тут нужно тестировать права.
http://daxmusings.codecrib.com/2013/...ources_31.html
Теги
dll, dllfunction

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ax3 and Win2008 для печати Arahnid DAX: Администрирование 13 22.04.2013 17:07
MSDAX 4.0 и планировщик win server 2008 werov2010 DAX: Администрирование 11 16.08.2012 14:18
Установка Ax2009 на локалку loka DAX: Администрирование 23 29.07.2009 12:34
при вызове функции из своей DLL, вылетает ошибка Delfins DAX: Программирование 9 07.03.2006 19:29
работа с wininet.dll Lucky13 DAX: Программирование 8 01.12.2004 15:03
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:52.