предлагаю вашему вниманию очередную бочину в энджине аксапты (ax3sp2):
демонстрирует его следующий джобик: кодирует строку в штрих код с попутной вставкой пустой строки в контейнер.
X++:
#define.bug(0)
#define.showstep(1)
#define.str2code("123")
static void Job144(Args _args)
{
container ret1;
str cret;
int clen;
int i;
// кодирует barcode
str encode(str _string)
{
DLLFunction _BC_Code128;
DLL _barcodeDLL;
str barcodeStr;
;
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::STRING);
barcodeStr = _BC_Code128.call(_string);
_barcodeDLL = null;
_BC_Code128 = null;
return barcodeStr;
}
;
try
{
cret = encode(#str2code);
info("до вставки в контейнер : '"+cret+"'");
for(i=1;i<10;i++)
{
#if.bug(1)
ret1 += "";
#endif
#if.bug(0)
ret1 = conins(ret1,conlen(ret1)+1,"");
#endif
#if.showstep(1)
cret = encode(#str2code);
info(strfmt("вставка %1, строка: '%2', баркод: '%3'",i,#str2code,cret));
#endif
}
cret = encode(#str2code);
}
catch
{
info("catch !!!");
}
info("после вставки в контейнер : '"+cret+"'");
}
В джобике проверяю как отрабатывает вызов dll функции после разных методов вставки в контейнер: ret1 += "" и ret1 = conins(ret1,conlen(ret1)+1,"")
для начала ставим #define.bug(0) -> происходит 10 вставок в контейнер с помощью conins + 10 удачных кодирований.
теперь ставим #define.bug(1) -> происходит 10 вставок в контейнер оператором += и 10 кодирований из которых 3 правильно, остальные нет.
для чистоты эксперимента можно исключить вызов кодирования в каждой итерации #define.showstep(0).
(совсем забыл, после того как контейнер "уложит" вызов ф-ции кодирования, функция уже нормально не отработает - перезапуск клиента). Т.е. нарушение каких то внутренних структур на лицо.
Вывод: не использовать для контейнера оператор +=<str>
PPS: вывод оказался не верным, что не может не радовать - базовые операторы таки работают нормально.