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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.05.2012, 08:02   #1  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
? Array -> File
Доброе утро.
Просьба помочь решить следующую задачку:
Некоторая COM - функция возвращает массив бинарных данных, который представляет собой zip - архив. Получив этот архив в аксапте, его необходимо сохранить как файл.
COM - функция объявлена так:
PHP код:
SAFEARRAY(unsigned charExportToZip(); 
Пока удалось сделать нехитрым перебором элементов массива:
X++:
    Array       aipArr      = new Array(Types::Integer);
    int           i;
    binData   binData;
    Binary     b;
    ;

    aipArr = tcContainer.ExportToZip();
    b = new Binary(aipArr.lastIndex());
    for(i = 1; i <= aipArr.lastIndex(); i++)
    {
        b.byte(i-1, aipArr.value(i));
    }

    binData = new binData();
    bindata.setBinaryData(b);
    binData.saveFile("d:\\test.zip");
Спасибо.
Старый 22.05.2012, 08:35   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Не уверен что это из этого что-нибудь получиться (и абсолютно не уверен что так будет лучше/быстрее), но в качестве идеи... Можно попробовать через
X++:
container c = aipArr.pack();
Старый 22.05.2012, 09:09   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Мне кажется, лучше не гонять данные через аксаптовские объекты, я бы предложил посмотреть в сторону ADO Stream:
X++:
#define.adTypeBinary            (1)
#define.adSaveCreateNotExist    (1)
#define.adSaveCreateOverwrite   (2)

COMVariant  arr = tcContainer.ExportToZip();
COM         adoStream = new COM('ADODB.Stream');
;
adoStream.Type(#adTypeBinary);
adoStream.Open();
adoStream.Write(arr);
adoStream.SaveToFile(@"c:\path\filename.zip", #adSaveCreateOverwrite);
За это сообщение автора поблагодарили: Roman777 (2), S.Kuskov (2).
Старый 22.05.2012, 09:10   #4  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Thumbs up
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Не уверен что это из этого что-нибудь получиться (и абсолютно не уверен что так будет лучше/быстрее), но в качестве идеи... Можно попробовать через
X++:
container c = aipArr.pack();
Такой способ пробовал - получается аксаптовский контейнер, в котором хранится свой формат.
Старый 22.05.2012, 09:16   #5  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Мне кажется, лучше не гонять данные через аксаптовские объекты, я бы предложил посмотреть в сторону ADO Stream:
X++:
#define.adTypeBinary            (1)
#define.adSaveCreateNotExist    (1)
#define.adSaveCreateOverwrite   (2)

COMVariant  arr = tcContainer.ExportToZip();
COM         adoStream = new COM('ADODB.Stream');
;
adoStream.Type(#adTypeBinary);
adoStream.Open();
adoStream.Write(arr);
adoStream.SaveToFile(@"c:\path\filename.zip", #adSaveCreateOverwrite);
Ошибка без описания в строке adoStream.Write(arr);
Старый 22.05.2012, 09:18   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Roman777 Посмотреть сообщение
Такой способ пробовал - получается аксаптовский контейнер, в котором хранится свой формат.
Возможно с этой неприятностью может справится ContainerClass.toBlob()...

A вот так не прокатит?
X++:
BinData.setVariant(tcContainer.ExportToZip())

Последний раз редактировалось S.Kuskov; 22.05.2012 в 09:23.
Старый 22.05.2012, 09:27   #7  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Возможно с этой неприятностью может справится ContainerClass.toBlob()...

A вот так не прокатит?
X++:
BinData.setVariant(tcContainer.ExportToZip())
И эти способы тоже опробованы, к сожалению не прокатывает.
Старый 22.05.2012, 09:41   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Roman777 Посмотреть сообщение
И эти способы тоже опробованы, к сожалению не прокатывает.
Нда, там при упаковке ещё служебная информация добавляется, причём не только в начало контейнера но и после каждого элемнта

Но интересно, почему не работает BinData.setVariant? Он не умеет работать с масивами?
Старый 22.05.2012, 09:44   #9  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Нда, там при упаковке ещё служебная информация добавляется, причём не только в начало контейнера но и после каждого элемнта

Но интересно, почему не работает BinData.setVariant? Он не умеет работать с масивами?
При попытке вызвать BinData.setVariant аксапта либо падала, либо просто не исполняла после этой строки код.
Старый 22.05.2012, 14:20   #10  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от Roman777 Посмотреть сообщение
При попытке вызвать BinData.setVariant аксапта либо падала, либо просто не исполняла после этой строки код.
Вы пробовали вызывать именно BinData.setVariant(tcContainer.ExportToZip()) или для передачи входящего параметра использовали промежуточную переменную типа COMVariant ?
__________________
Дмитрий
Старый 22.05.2012, 14:27   #11  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Цитата:
Сообщение от Damn Посмотреть сообщение
Вы пробовали вызывать именно BinData.setVariant(tcContainer.ExportToZip()) или для передачи входящего параметра использовали промежуточную переменную типа COMVariant ?
И так и так.
Старый 09.07.2012, 14:52   #12  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Уважаемые участники форума,
просьба к Вам поделиться опытом сохранения в файл данных, полученных из COM-метода, который возвращает массив byte[], а также чтения данных из файла и передача их в СОМ-метод, который принимает массив byte[].
Запутался в трех деревьях: COMVariant, Array, BinData.
Спасибо!
Старый 28.07.2014, 12:25   #13  
Spiker is offline
Spiker
GMCS
Сотрудники компании GMCS
 
6 / 10 (1) +
Регистрация: 07.06.2007
Адрес: Пенза
Добрый день, удалось как то разрешить указанную проблему? стоит такая же задача. Спасибо.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DynamicsAxSCM: Visualizing Security in Microsoft Dynamics AX 2012 Blog bot DAX Blogs 0 29.08.2011 13:11
Trace Parser. Error: Incorrect or missing MOF file, import is not available. Poleax DAX: Администрирование 6 13.05.2011 10:43
DynamicsAxSCM: Personalization of Role Centers in Dynamics AX 2009 Blog bot DAX Blogs 0 21.06.2010 16:05
Report -> html file Rimantas DAX: Программирование 1 18.05.2010 17:31
axStart: When is my Label file updated in AX? Blog bot DAX Blogs 8 28.01.2010 22:09

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

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

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