Показать сообщение отдельно
Старый 25.09.2007, 11:35   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2480 (88) +++++++++
Регистрация: 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).