Я делаю следующим образом:
long number_metod;
AnsiString name_metod="";
VARIANT result_metod;
SAFEARRAY * safe_array;
VARIANT value_parameter;
long i=0;
AnsiString str_value_parameter="";
name_metod="НоваяЭтикетка";
Prn->FindMethod(WideString(name_metod.c_str()).c_bstr(),&number_metod);
hr=Prn->CallAsFunc(number_metod,NULL,NULL);
name_metod="PutBarcode";
Prn->FindMethod(WideString(name_metod.c_str()).c_bstr(),&number_metod);
safe_array = SafeArrayCreateVector(VT_VARIANT, 0, 5);
value_parameter=Variant(5);i=0; hr = SafeArrayPutElement(safe_array, &i, &value_parameter);
value_parameter=Variant(1); i=1; hr = SafeArrayPutElement(safe_array, &i, &value_parameter);
value_parameter=Variant(2); i=2; hr = SafeArrayPutElement(safe_array, &i, &value_parameter);
str_value_parameter="E";
value_parameter.vt=VT_BSTR;
value_parameter=Variant(WideString(str_value_parameter.c_str()).c_bstr()); i=3; hr = SafeArrayPutElement(safe_array, &i, &value_parameter);
str_value_parameter="200000124841";
value_parameter.vt=VT_BSTR;
value_parameter=Variant(WideString(str_value_parameter.c_str()).c_bstr()); i=4; hr = SafeArrayPutElement(safe_array, &i, &value_parameter);
hr=Prn->CallAsFunc(number_metod,&result_metod,&safe_array);
SafeArrayDestroy(safe_array);
name_metod="Print";
Prn->FindMethod(WideString(name_metod.c_str()).c_bstr(),&number_metod);
safe_array = SafeArrayCreateVector(VT_VARIANT, 0, 1);
value_parameter=Variant(1); i=0; hr = SafeArrayPutElement(safe_array, &i, &value_parameter);
hr=Prn->CallAsFunc(number_metod,&result_metod,&safe_array);
SafeArrayDestroy(safe_array);
У меня выполняется только последний метод. Выводит на принтере заданное количество пустых этикеток.