Хм.
Стал разбираться в функции 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().
Ну и кода получится значительно больше, чем при использовании моего подхода