Исходный код внешней компоненты GodexESC.dll

Страницы: 1
RSS
Исходный код внешней компоненты GodexESC.dll, Обсуждение: Исходный код внешней компоненты GodexESC.dll
 
Здравствуйте! Извиняюсь за вопрос.

А нельзя ли как-нибудь посмотреть исходный код внешней компоненты GodexESC.dll.
Интересует процесс передачи параметров в методы через структуру SAFEARRAY.
Пытаюсь использовать компоненту в своей программе, но никак не могу правильно передать текстовые параметры в компоненту. Заранее благодарен.
 
Я делаю следующим образом:


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);

У меня выполняется только последний метод. Выводит на принтере заданное количество пустых этикеток.
 
В методе CallAsFunc третий аргумент это двойной указатель на SAFEARRAY, тоесть 0 эелемент массива SafeArray должен быть ещё один SafeArray и в нём уже все те пять параметров которые вы хотели передать в компаненту, в Delphi я делал это таким образом:

var {global}
lib: variant;//Компанентна
var
ds: integer;//Переменная результата метода пинга
P0: Variant;//Заполняемые массивы
P1: Variant;//Передаваемый массив
begin
  //Создаём отправляемые массивы данных
  P0:= VarArrayCreate([0,3],varVariant);
  P1:= VarArrayCreate([0,0],varVariant);
  //Заполняем массивы
  P0[0] := edit1.text;
  P0[1] := strtoint(edit2.text);
  P0[2] := strtoint(edit3.text);
  P1[0] := P0;
  //Вызываем метот Ping
  ds:=lib.ping(P1[0]);
  //Проверяем результат и выводим информацию
  if ds=1
  then showmessage('Терминал найден!')
  else showmessage('Терминал не найден!');
end;
 
Вот, если бы на с++......
 
А в runtime при выполнение этого кода он ошибок не каких не выдаёт типа - Несовпадение типов, итд?
В вашем случае ваш код должен выглядить примерно вот так:

Variant safe1, safe2;
AnsiString _str;
Variant _vt;
safe1 = VarArrayCreate([0,4],varVariant);
safe2 = VarArrayCreate([0,0],varVariant);
safe1[0] = Variant(5);
safe1[1] = Variant(1);
safe1[2] = Variant(2);
_str = "E";
_vt.vt = VT_BSTR;
_vt = Variant(WideString(_str.c_str()).c_bstr());
safe1[3] = _vt;
_str = "200000124841";
_vt.vt = VT_BSTR;
_vt = Variant(WideString(_str.c_str()).c_bstr());
safe1[4] = _vt;
safe2[0] = safe1;
hr=Prn->CallAsFunc(number_metod,&result_metod,&safe2[0]); //либо hr=Prn->CallAsFun (number_metod,&result_metod,&safe2);

У меня к сожалению не стоит С Билдер поэтому не тестил этот код, но алгоритм должен быть примерно такой.
 
Пока работает только один метод. Выводит на принтер пустые этикетки. Можно менять количество, сколько задаю столько и выводит. (4)


Variant P0(OPENARRAY(int,(0,1)),varVariant);
P0.PutElement(4,0);  //4 штуки
SAFEARRAY* sa=P0;

name_metod="Print";
Prn->FindMethod(WideString(name_metod.c_str()).c_bstr(),&number_metod);
hr=Prn->CallAsFunc(number_metod,&result_metod,&sa);

Но в данном случае только один массив?
 
Вы опять используете не двойной указатель, а лиш одномерный SafeArray.
Нужно Нулевому элементу SafeArray'я присвоить ещё один SafeArray в котором у нас и будут хранится нужные вам передаваямые значения.
Ну и чтобы не печатал пустые этикетки я думаю нужно как то заполнять таки то что он должен будет печатать.
 
Верно, перед вызовом ПечатьЭтикетки, нужно ее еще создать и заполнить.
 
Когда я пытаюсь использовать два массива, то даже заданное количество пустых этикеток не печатается. Просто начинает двигаться лента. (для остановки приходиться выключать принтер)

При использовании одного массива, сколько задаю этикеток, столько и печатается.
Значит видимо метод работает. Проблема, наверно, в чем то другом......

Создать этикетку получается, но чем-то ее наполнить уже нет.
Проблема в передаче параметров в метод CallAsFunc.....
Страницы: 1