Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Ошибка на сервере eolesyserror  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1228
Добрый день. такой код

ofc := CreateOleObject('COMobj.Office');
ofc.Connect;
client := ofc.GetClientByCode(311);

  tran := client.GetTransactions;         //старый код возвращает интерфейс ITran
  ShowMessage(IntToStr(tran.Count));

  contracts := client.GetContracts;    //свежедобавленный код возвращает интерфейс IContracs
  ShowMessage(IntToStr(contracts.Count));


Оба интерфейса содержат пару методов, абсолютно идентичных, различается только источник данных. При отладке GetContracts я вижу, что возвращается объект IContracs и его свойство Count = 2
но при вызове contracts.Count в этом коде получаем
ошибка на сервере eolesyserror
Программу-сервер от имени админа запускал, на другой машине пробовал, идентичность кода перепроверил по 5 раз. В утилитке OLEView в интерфейсе IContracs метод Count есть.
В каком месте в бубен постучать?
18 ноя 21, 16:35    [22397587]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
1. COM сервер ваш или сторонний?
2. COM сервер In-Process или Out-Process (exe или dll)?
3. COM сервер содержит в ресурсах TLB?
4. После модификации TLB, она была зарегистрирована
5. Проимпортированная TLB соответствует той, которую использует сервер
18 ноя 21, 16:41    [22397592]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1228
_Vasilisk_,

1. мой
2. exe
3-5. Не силен в этом вопросе, редко касаемся этой проги.
Обычно при добавлении нового интерфейса делали первый запуск обновленного exe-шника от имени админа и никаких проблем.
В том числе и подобные интерфейсы, как в примере, содержащие просто перечень кодов, они все близнецы-братья
А тут засада на ровном месте
18 ноя 21, 16:55    [22397604]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
minva,

Покажите описание интерфейса IContracs (полностью!) из сервера и из клиента
18 ноя 21, 17:08    [22397613]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 63461
Фигасе какие старые мемберы вылазят иногда...
Как вы пароль-то хоть помните? :)
18 ноя 21, 17:40    [22397632]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1228
_Vasilisk_,
Полностью - это насколько полностью? Этого достаточно?
Порядок следования методов делать одинаковым еще не пробовал, точки полной безысходности еще не достиг
Код на стороне клиента я привел в первом сообщении, только сократил названия интерфейсов в комментах
Это НЕ работает
// *********************************************************************//
// Interface: IContractsCollection
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {C1C56FCE-8B7E-4ADE-8024-A6C3033EFEF2}
// *********************************************************************//
  IContractsCollection = interface(IAfsAccessObj)
    ['{C1C56FCE-8B7E-4ADE-8024-A6C3033EFEF2}']
    function Get_Item(index: Integer): IContract; safecall;
    function Get_Count: Integer; safecall;
    function Get__NewEnum: IUnknown; safecall;
    property Item[index: Integer]: IContract read Get_Item; default;
    property Count: Integer read Get_Count;
    property _NewEnum: IUnknown read Get__NewEnum;
  end;

// *********************************************************************//
// DispIntf:  IContractsCollectionDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {C1C56FCE-8B7E-4ADE-8024-A6C3033EFEF2}
// *********************************************************************//
  IContractsCollectionDisp = dispinterface
    ['{C1C56FCE-8B7E-4ADE-8024-A6C3033EFEF2}']
    property Item[index: Integer]: IContract readonly dispid 0; default;
    property Count: Integer readonly dispid 201;
    property _NewEnum: IUnknown readonly dispid -4;
    function PropIsNull(const PropName: WideString): WordBool; dispid 10001;
    function DateTimeFieldStr(const PropName: WideString): WideString; dispid 10002;
  end;
 

Это работает
 // *********************************************************************//
// Interface: IAccountTransactionCollection
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {FEBA753A-42D6-4AF7-B5B7-023D04E681B3}
// *********************************************************************//
  IAccountTransactionCollection = interface(IAfsAccessObj)
    ['{FEBA753A-42D6-4AF7-B5B7-023D04E681B3}']
    function Get_Count: Integer; safecall;
    function Get__NewEnum: IUnknown; safecall;
    function Get_Item(index: Integer): IAccountTransaction; safecall;
    property Count: Integer read Get_Count;
    property _NewEnum: IUnknown read Get__NewEnum;
    property Item[index: Integer]: IAccountTransaction read Get_Item; default;
  end;

// *********************************************************************//
// DispIntf:  IAccountTransactionCollectionDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {FEBA753A-42D6-4AF7-B5B7-023D04E681B3}
// *********************************************************************//
  IAccountTransactionCollectionDisp = dispinterface
    ['{FEBA753A-42D6-4AF7-B5B7-023D04E681B3}']
    property Count: Integer readonly dispid 201;
    property _NewEnum: IUnknown readonly dispid -4;
    property Item[index: Integer]: IAccountTransaction readonly dispid 0; default;
    function PropIsNull(const PropName: WideString): WordBool; dispid 10001;
    function DateTimeFieldStr(const PropName: WideString): WideString; dispid 10002;
  end;
19 ноя 21, 10:09    [22397819]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
minva
Это НЕ работает
У вас файл _TLB.pas используется и в клиенте и в сервере. Это один и тот же файл или разные? Если разные, то покажите описания из обоих файлов. А так же из файла, который получится в результате выполнения команды
tlibimp -P+ MyServer.exe
19 ноя 21, 12:23    [22397888]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1228
_Vasilisk_,
так я и показал кусок из TLB файла. Он на сервере. В результате выполнения команды получилось тоже самое.
Клиент вообще ничего про *TLB.pas это не знает. Этот клиент, код которого я привел, отладочный. Реальные клиенты сидят на 1С, которым дали описание интерфейсов и EXE файл
19 ноя 21, 13:42    [22397933]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
minva
Клиент вообще ничего про *TLB.pas это не знает
Как это? Тогда покажите из первого кода объявление всех переменных. А заодно покажите объявление и реализацию метода client.GetContracts и реализацию метода IContractsCollection.Get_Count

Сообщение было отредактировано: 19 ноя 21, 14:01
19 ноя 21, 14:00    [22397946]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1228
переменные на клиенте
var
  z,: variant;
  i, j: integer;
  ofc: variant;
  client: variant;
  contracts: Variant;
  contract: Variant;


TContractsCollectionImpl =  class(TAbstractEnumByCodes, IContractsCollection)
 private
    function GetSQL(from, till: TDateTime; clientCode: integer): string;
  protected
    function Get_Item(index: Integer): IContract; safecall;

    function GetCurrentItem: IUnknown; override;
  public
    constructor Create(office: TOffice);
    procedure LoadContracts(from, till: TDateTime; clientCode: integer);
  end;

   TAccountTransactionCollection = class(TAbstractEnumByCodes, IAccountTransactionCollection)
  private
    function GetSQL(from, till: TDateTime; const filterField: string;
      filterValue, afsID: integer): string;
  protected
    function Get_Item(index: Integer): IAccountTransaction; safecall;

    function GetCurrentItem: IUnknown; override;
  public
    constructor Create(office: TOffice);
    procedure LoadClientTransactions(from, till: TDateTime; clientCode: integer; afsID: integer = -1);
    procedure LoadAccountTransactions(from, till: TDateTime; accountNumber: integer; afsID: integer = -1);
  end;


как видим у обоих интерфейсов(и других подобных) одинаковый предок, в котором и реализуется Get_Count. И там все работает
Но дело не в GetCount, Item тоже не вызывается с такой же ошибкой.

function TClient.GetContractsInPeriod(from,
  till: TDateTime): IContractsCollection;
var
  contracts: TContractsCollectionImpl;
begin
  contracts := TContractsCollectionImpl.Create(fOffice);
  try
    contracts.LoadContracts(from, till, fCode);
  except
    FreeAndNil(contracts);
    raise;
  end;
  result := contracts as IContractsCollection;
end;


PS В исходном сообщении я опустил аргументы функций ,т.к. они к сути вопроса не относятся. Объект класса TContractsCollectionImpl формируется абсолютно нормально и данными заполняется правильными

К сообщению приложен файл. Размер - 14Kb
19 ноя 21, 14:25    [22397956]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
minva
переменные на клиенте
var
  z,: variant;
  i, j: integer;
  ofc: variant;
  client: variant;
  contracts: Variant;
  contract: Variant;
Попробуйте все Variant заменить на интерфейсы (для этого нужно добавить uses _TLB). Ошибка останется?
19 ноя 21, 14:57    [22397984]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка на сервере eolesyserror  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1228
var
  tran: variant;
  i, j: integer;
  ofc: IOffice;
  client: IClient;
  contracts: IContractsCollection;
  contract: IContract;


Спасибо! Так заработало. НО.
1. Я уже кучу лет эпизодически возвращаюсь к этому COM-объекту добавляя новый функционал
Отлаживаюсь на тестовом приложении используя варианты и проблем не было
2. tran то вариантом остался и тоже работает.

Где-то должна быть разница... И я её не вижу
19 ноя 21, 15:37    [22398008]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить