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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.09.2007, 11:35   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Хм.
Стал разбираться в функции BC_Code128 и вот какая картина открывается.

Внутри BC_Code128, для проверки правильности данных в передаваемой строке вызывается системная функция SysStringByteLen(), в которую в качестве параметра передается тип BSTR. Внутри этой функции и проверяется смещение на четые байта от начала строки - берется ее размер. Если там не ноль, то BC_Code128 считает, что строка валидная и обрабатывает ее.
А здесь начинаются чудеса. Обрабатывается уже не тип BSTR, а обыкновенная ANSI-строка. Т.е., получается, нужен некий аналог паскалевской строки.

Теперь о том, как ее получить.
Начиная с KR2 можно передавать строку как тип ExtTypes::BStrAnsi - как раз передается паскалевская строка в вызываемую функцию (опять же, ожидал увидеть юникод, по-этому в предыдущем сообщении сделал неверный вывод).
Если не установлен KR2 или выше, то можно использовать такой код
X++:
str  encode(str _string)
{
    DLLFunction         _BC_Code128;
    DLL                 _barcodeDLL;
    str                 barcodeStr;
    Binary    pStr = new Binary(strlen(_string) + 4 + 1);
    Binary    ptr = new Binary(4);
;
    try
    {
        _barcodeDLL = new DLL('Bcfont32');
    } catch(Exception::Internal)
    {
        info("barcodeDLL error!!!");
        return '';
    }
    _BC_Code128 = new DLLFunction(_barcodeDLL,'BC_Code128');
    _BC_Code128.returns(ExtTypes::String);
    _BC_Code128.arg(ExtTypes::DWord);
    pStr.DWord(0, strlen(_string));
    pStr.String(4, _string);
    ptr.Binary(0, pStr);
    barcodeStr = _BC_Code128.call(ptr.DWord(0)+4);
    _barcodeDLL = null;
    _BC_Code128 = null;
    return barcodeStr;
}
В общем, сбила меня с толку функция SysStringByteLen() - проверять правильность напечатанного штрих-кода я не стал, а, как выяснилось, зря
Прошу прощения у почтенной публики

PS. Если кому интересно
В KR2 для преобразования строки в тип ExtTypes::BStrAnsi вызывается функция SysAllocStringByteLen() из oleaut32.dll. В принципе, можно использовать ее для явного преобразования из кода x++. Только не забывать, что необходимо освобождать полученную память с помощью вызова SysFreeString().

Ну и кода получится значительно больше, чем при использовании моего подхода
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 25.09.2007 в 12:02.
За это сообщение автора поблагодарили: Logger (2).
Теги
bstr, lpstr, баг, штрихкод

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Цветные строки в Grid Sergo DAX: База знаний и проекты 14 19.04.2012 10:02
контейнер: '+=' vs 'conins' небольшое исследование SHiSHok DAX: Программирование 6 18.02.2010 15:58
При повторном вызове linkActive проваливается в validateWrite(Строки общего журнала ГК) Lemming DAX: Программирование 6 25.10.2007 13:50
При создании строки в закупке статус строки становится "Отменено" AlexUnik DAX: Функционал 4 27.09.2004 16:05
Функция "Удалить строки" Oks DAX: Функционал 1 03.07.2002 18:09

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

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

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