powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка на сервере eolesyserror
12 сообщений из 12, страница 1 из 1
Ошибка на сервере eolesyserror
    #40112897
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. такой код

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 есть.
В каком месте в бубен постучать?
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40112900
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. COM сервер ваш или сторонний?
2. COM сервер In-Process или Out-Process (exe или dll)?
3. COM сервер содержит в ресурсах TLB?
4. После модификации TLB, она была зарегистрирована
5. Проимпортированная TLB соответствует той, которую использует сервер
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40112910
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

1. мой
2. exe
3-5. Не силен в этом вопросе, редко касаемся этой проги.
Обычно при добавлении нового интерфейса делали первый запуск обновленного exe-шника от имени админа и никаких проблем.
В том числе и подобные интерфейсы, как в примере, содержащие просто перечень кодов, они все близнецы-братья
А тут засада на ровном месте
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40112918
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva,

Покажите описание интерфейса IContracs (полностью!) из сервера и из клиента
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40112929
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фигасе какие старые мемберы вылазят иногда...
Как вы пароль-то хоть помните? :)
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40113038
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Полностью - это насколько полностью? Этого достаточно?
Порядок следования методов делать одинаковым еще не пробовал, точки полной безысходности еще не достиг
Код на стороне клиента я привел в первом сообщении, только сократил названия интерфейсов в комментах
Это НЕ работает
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
// *********************************************************************//
// 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;
 


Это работает
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 // *********************************************************************//
// 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;
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40113079
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva
Это НЕ работает
У вас файл _TLB.pas используется и в клиенте и в сервере. Это один и тот же файл или разные? Если разные, то покажите описания из обоих файлов . А так же из файла, который получится в результате выполнения команды
Код: powershell
1.
tlibimp -P+ MyServer.exe
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40113105
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
так я и показал кусок из TLB файла. Он на сервере. В результате выполнения команды получилось тоже самое.
Клиент вообще ничего про *TLB.pas это не знает. Этот клиент, код которого я привел, отладочный. Реальные клиенты сидят на 1С, которым дали описание интерфейсов и EXE файл
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40113114
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva
Клиент вообще ничего про *TLB.pas это не знает
Как это? Тогда покажите из первого кода объявление всех переменных. А заодно покажите объявление и реализацию метода client.GetContracts и реализацию метода IContractsCollection.Get_Count
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40113122
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переменные на клиенте
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  z,: variant;
  i, j: integer;
  ofc: variant;
  client: variant;
  contracts: Variant;
  contract: Variant;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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 тоже не вызывается с такой же ошибкой.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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 формируется абсолютно нормально и данными заполняется правильными
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40113138
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva
переменные на клиенте
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  z,: variant;
  i, j: integer;
  ofc: variant;
  client: variant;
  contracts: Variant;
  contract: Variant;

Попробуйте все Variant заменить на интерфейсы (для этого нужно добавить uses _TLB). Ошибка останется?
...
Рейтинг: 0 / 0
Ошибка на сервере eolesyserror
    #40113155
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  tran: variant;
  i, j: integer;
  ofc: IOffice;
  client: IClient;
  contracts: IContractsCollection;
  contract: IContract;



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

Где-то должна быть разница... И я её не вижу
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка на сервере eolesyserror
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]