Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2014, 03:01   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию подключение к Mobile SMARTS через ActiveSync

Здравствуйте.
Помогите с такой проблемой:
Есть моя программа для учета товаров на складе Delphi + Firebird, есть ТСД (терминал сбора данных) honeywell scanpal 5100 с установленной на нем Windows CE 5.0 и програмой «Клеверенс».
Подключение между компом и ТСД происходи по средствам Microsoft ActiveSync
Дело в том, что этот клеверенс работает в основном с 1с, моя задача заставить работать его с моим софтом. Позвонил я в этот клеверенс, попросил дать мне описания dll которые работают с ТСД, мне все любезно предоставили и вроде бы все в описании понятно за исключением того как подключиться к этому терминалу.
Есть пример на 1с (http://www.cleverence.ru/site.aspx?p...marts-Workflow)
Код:
// Создание объекта коннектора и инициализация его соединения с сервером
connector = СоздатьОбъект(«Cleverence.Warehouse.StorageConnector»);
connector.InitializeServerConnection(СокрЛП(Константа.ПолучитьАтрибут("СтрокаПодключения")));
Я пишу на Delphi
Код:
procedure TForm1.Button1Click(Sender: TObject);
  var
   TSD: Variant;
   s : string;
begin
  try
    TSD:=CreateOleObject('Cleverence.Warehouse.StorageConnector');
    TSD.InitializeServerConnection('А что писать тут не знаю');
  except
    on E : Exception do
      begin
        Memo1.Clear;
        Memo1.Lines.Add(E.Message);
      end;
  end;
end;
Но вот беда до меня никак не дойдет, что нужно прописать в string "СтрокаПодключения".
Помогите пожалуйста разобраться.
Вот ссылка на описание
http://www.cleverence.ru/mobile-smar.../comconnector/
Буду очень благодарен.

Последний раз редактировалось tarakan1983; 12.11.2014 в 03:04.
tarakan1983 вне форума Ответить с цитированием
Старый 12.11.2014, 03:38   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от tarakan1983 Посмотреть сообщение
Код:
connector.InitializeServerConnection(СокрЛП(Константа.ПолучитьАтрибут("СтрокаПодключения")));
В примере для 1С 7.7 строка подключения прописана в самой конфигурации. Поэтому её оттуда и получают средствами встроенного языка.
Что же из себя представляет непосредственно сама строка подключения? Здесь уже лучше всего обратиться к самим разработчикам, если они не осветили данный вопрос в документации.
Streletz вне форума Ответить с цитированием
Старый 12.11.2014, 06:37   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

а в адинеске отладчиком глянуть или
Alert(СокрЛП(Константа.ПолучитьАтри бут("СтрокаПодключения")));
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 12.11.2014, 08:56   #4
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
а в адинеске отладчиком глянуть или
Alert(СокрЛП(Константа.ПолучитьАтри бут("СтрокаПодключения")));
Дело в том, что в открытой мной конфигурации 7.7 и во всех обработках это не выглядит константой. В 1с сильно не соображаю и куда воткнуть строку
Код:
Alert(СокрЛП(Константа.ПолучитьАтрибут("СтрокаПодключения")));
Если честно сообразить не могу уже час.
tarakan1983 вне форума Ответить с цитированием
Старый 12.11.2014, 09:20   #5
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Вывод через функцию Сообщить() не помогает?
Streletz вне форума Ответить с цитированием
Старый 12.11.2014, 09:27   #6
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Вывод через функцию Сообщить() не помогает?
Вот функция из внешней компоненты
Код:
// *****************************************************************************
// Описание:
//  Загружает внешнюю компоненту, создает объект и включает
Функция Подключить(Компонента, ПрогИд, Объект)
	Рез = 0;
	  
	Сообщить("Выполняется подключение ТСД...");
	Компонента = "AddIn.Cl.TerminalConnector";
	Если ПодключитьВнешнююКомпоненту(Компонента) = 0 Тогда
		ОписаниеРезультата = "ошибка загрузки внешней компоненты """ + Компонента + """";
	Иначе
		Попытка
			Объект = СоздатьОбъект(Компонента);  // Создание объекта внешней компоненты
		Исключение
		КонецПопытки;

		Если ПустоеЗначение(Объект) = 1 Тогда
			ОписаниеРезультата = "ошибка создания объект внешней компоненты с программым идентификатром AddIn." + ПрогИд;
		Иначе        
			Объект.УстановитьВерсию1С("v7");
			
			СохранитьЗначение("CleverenceТСДНастройкиСоединения", ПолучитьПустоеЗначение());
			Параметры = СоздатьОбъект("СписокЗначений"); 
			
			времОбменЧерезПапку = ВосстановитьЗначение("CleverenceТСДОбменЧерезПапку"); 	
			Если (ПустоеЗначение(времОбменЧерезПапку) = 0) И (времОбменЧерезПапку = 1) Тогда
				ПапкаОбмена = ВосстановитьЗначение("CleverenceТСДПапкаОбмена");	
				Параметры.ДобавитьЗначение(ПапкаОбмена);
			КонецЕсли;
			
			Если Объект.Подключить(Параметры, ИдУстройства) = 0 Тогда
				ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
			Иначе
			    Рез	= 1; 
				Сообщить("ТСД подключен"); 
				//Сообщить(Объект.Подключить(Параметры, ИдУстройства)); 
				Сообщить(Параметры);
			КонецЕсли; 
			Объект.ОсвободитьРесурсы();
		КонецЕсли;
	КонецЕсли;
	
	Возврат Рез;
КонецФункции
Куда это вставить?

Разобрался немного пообщавшись с ТП.
Нужно использовать другое подключение при соединении USB
вот так :
Код:
procedure TForm1.Button1Click(Sender: TObject);
  var
   TSD: Variant;
   s : string;
   sl : TList;
begin
  try
    sl := TList.Create;
    try
      TSD := CreateOleObject('AddIn.Cl.TerminalConnector');
      TSD.GetDocumentsList('',sl);
    except
      on E : Exception do
        begin
          Memo1.Clear;
          Memo1.Lines.Add(E.Message);
        end;
    end;
  finally
    sl.Free;
  end;
end;
Теперь возник немного другой вопрос.
из инструкции
Цитата:
Функция GetDocumentsList/ПолучитьСписокДокументов
int ПолучитьСписокДокументов (string ИдУстройства, object СписДокументов)
Получает описания документов с ТСД или сервера терминалов. В переменную СписДокументов - передается список значений, который заполняется описанием документов, в виде «Имя документа|Ид. документа|Имя ТСД|IP-адрес ТСД|Тип документа».
ИдУстройства - Идентификатор ТСД (не используется, может быть пустым значением).
СписДокументов - Список значений, заполняется описанием документов.
Результат 0 – ошибка; 1 – удачно.
я сделал Tlist для "object СписДокументов", но компилятор ругается при вызове
Код:
TSD.GetDocumentsList('',sl);
пишет
Цитата:
E2281 Type not allowed in Variant Dispatch call
Подскажите пожалуйста, что мне использовать вместо Tlist

Последний раз редактировалось tarakan1983; 12.11.2014 в 11:25.
tarakan1983 вне форума Ответить с цитированием
Старый 12.11.2014, 22:00   #7
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Ребята, ну помогите пожалуйста.
Разобрался вроде со всем, но не знаю как передать массив с переменными в функцию из dll. Я уже декомпильнул эту dll и теперь ситуация такая
Вот функция из dll
Код:
public bool Open(object ValuesArray, ref string DeviceID)
    {
      this.ResetLastError();
      try
      {
        this.workWithServer = false;
        this.serverConnnectionString = "";
        this.serverProxy = "";
        this.proxyPort = 0;
        this.rewriteProductsBook = true;
        this.exchangeFolder = (string) null;
        if (ValuesArray != null)
          this.GetConnectionParams(ValuesArray);
        if (!this.Connected)
          this.Connect();
        if (!this.workWithServer && !this.UseExchangeFolder)
        {
          this.CheckLicense();
          DeviceID = this.terminal.GetDeviceId();
        }
      }
      catch (Exception ex)
      {
        DeviceID = "";
        this.SetLastError("Ошибка при подключении терминала.", ex);
        return false;
      }
      finally
      {
        if (!this.workWithServer)
          this.CloseTerminalConnection();
      }
      return true;
    }
вот моя процедура
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   TSD: Variant;
   idTSD : string;   
   masPar :  Variant;
   i : Integer;
begin
  try
    TSD := CreateOleObject('AddIn.Cl.TerminalConnector');
    id := TSD.GetTerminalId;
    masPar := VarArrayCreate([0,2], varVariant);
    masPar[0]:= 0;
    masPar[1]:= 1;
    masPar[2]:= '';
    i := TSD.Open(masPar,id);
    Memo1.Clear;
    case i of
      0 : begin
            Memo1.Lines.Add('Ошибка подключения');
            TSD.GetLastError(s);
            Memo1.Lines.Add(s);
          end;
      1 : Memo1.Lines.Add('Успешно');
    end;
  except
    on E : Exception do
      begin
        Memo1.Clear;
        Memo1.Lines.Add(E.Message);
      end;
  end;
end;
здесь i := TSD.Open(masPar,id); получается равной нулю.
из функции dll вижу, что
Код:
if (ValuesArray != null) this.GetConnectionParams(ValuesArray);
Получается массив который я передаю в функцию = null, почему, что я сделал неправильно? Помогите пожалуйста.
вот фунция GetConnectionParams(ValuesArray);
Код:
    int num;
        try
        {
          num = Convert.ToInt32(this.InvokeExternalMethod(ValuesArray, "Количество"));
        }
        catch (Exception ex)
        {
          throw new KnownException("Ошибка при получении 'Количество'", ex);
        }
        if (num > 1)
        {
          object obj1 = this.InvokeExternalMethod(ValuesArray, "Получить", (object) 0);
          if (obj1 == null || obj1 is DBNull)
            obj1 = (object) false;
          if (obj1 is int || obj1 is short || obj1 is long)
            obj1 = Convert.ToInt32(obj1) != 0 ? (object) true : (object) false;
          try
          {
            this.workWithServer = Convert.ToBoolean(obj1);
          }
          catch (Exception ex)
          {
            throw new KnownException("Ошибка при получении 'Режим соединения' (workWithServer), получено: " + obj1.ToString(), ex);
          }
Из описания
Цитата:
Open/Подключить
int Подключить (object МассивПараметров, ref string ИдУстройства)
Выполняет инициализацию компоненты драйвера.
МассивПараметров Массив содержащий параметры подключения:
1. ТипСвязи (Целое: о или 1), о - прямая связь с ТСД, 1 - связь с сервером терминалов;
Для случая прямой связи с ТСД:
2. ПереписыватьНоменклатуру (Целое: о или 1), о - не переписывать полностью номенклатуру при выгрузке (добавлять новые позиции), 1 - переписывать полностью;
3. ПутьКПапкеОбмена (Строка) пустая строка, если не используется обмен через папку;
tarakan1983 вне форума Ответить с цитированием
Старый 13.11.2014, 12:34   #8
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от tarakan1983 Посмотреть сообщение
Подскажите пожалуйста, что мне использовать вместо Tlist
variant; - везде где сомневаешься и всегда когда не знаешь

сравни
Код:
    TSD := CreateOleObject('AddIn.Cl.TerminalConnector');
    id := TSD.GetTerminalId;
    masPar := VarArrayCreate([0,2], varVariant);
    masPar[0]:= 0;
    masPar[1]:= 1;
    masPar[2]:= '';
    i := TSD.Open(masPar,id);
Код:
Объект = СоздатьОбъект("AddIn.Cl.TerminalConnector");
Параметры = СоздатьОбъект("СписокЗначений"); 
времОбменЧерезПапку = ВосстановитьЗначение("CleverenceТСДОбменЧерезПапку"); 	
Если (ПустоеЗначение(времОбменЧерезПапку) = 0) И (времОбменЧерезПапку = 1) Тогда
	ПапкаОбмена = ВосстановитьЗначение("CleverenceТСДПапкаОбмена");	
	Параметры.ДобавитьЗначение(ПапкаОбмена);

Если Объект.Подключить(Параметры, ИдУстройства) = 0 Тогда
	ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Иначе
КонецЕсли;
итого имеем: как ты заполняешь массив masPar? что туда пихаешь?
можно попробовать так
Код:
var
 Pars:array of variant;
 masPar:variant;
.....
  SetLength(Pars,1);
  Pars[0]:='CleverenceТСДПапкаОбмена';
  SetLength(Pars,Length(Pars)+1);
  Pars[Length(Pars)-1]:='еще какой то параметр';


  masPar:=VarArrayOf(Pars);
  i := TSD.Open(masPar,id);
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 13.11.2014 в 12:59.
Slym вне форума Ответить с цитированием
Старый 13.11.2014, 12:37   #9
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Ответ разрабочиков
Цитата:
Open/Подключить
int Подключить (object МассивПараметров, ref string ИдУстройства)
МассивПараметров - Массив (для 1С 8.0, 8.1) или Список значений (для 1С 7.7), содержащий
параметры подключения.

Функция принимает два параметра, первый - объект массива 1С, массив Delрhi не подойдет, предавать параметры, которые должны быть в массиве, через запятую тоже не выйдет.
Такая реализация связана со стандартом 1С на драйвер торгового оборудования, согласно которому в компененте драйвера должны быть определенные функции с определенными параметрами.
Кроме функций, которые должны быть по стандарту 1С, AddIn.Cl.TerminalConnector содержит еще дополнительные функции, так что использование не с 1С тоже возможно.
Меня здесь угнетает одно
Цитата:
массив Delрhi не подойдет
неужели Delphi не может обмануть это железо и дать массив с нужными параметрами?
tarakan1983 вне форума Ответить с цитированием
Старый 13.11.2014, 13:35   #10
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

да наделать по большому на угнетения!
дельфя и 1С пользуют одну технологию доступа - COM
com - это variant вдоль и поперек
Массивы в Com это Variant в котором SafeArray, но в дельфе если не ошибаюсь и VarArray работает через SafeArray
вопрос в другом: объект массива 1С - что в этом массиве, что туда 1С ложит, количество элементов?
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 13.11.2014 в 13:37.
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение к БД через интернет. Dimarik Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 26.08.2013 17:44
подключение двух компьютеров к интернет через одно подключение Chudo4258 Помощь студентам 3 30.03.2010 16:07
Как через Mobile PhoneTools закачать игру на Philips 598 LuMax Свободное общение 0 15.02.2008 10:05
подключение через минипорт benjaminfran Работа с сетью в Delphi 3 14.02.2008 21:54
Подключение через proxy Рустам Работа с сетью в Delphi 2 15.11.2007 12:45