powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / По интерфейсам IUnknown
6 сообщений из 6, страница 1 из 1
По интерфейсам IUnknown
    #40076018
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два однотипных модуля Un_API_DLL1 и Un_API_DLL2.
В каждом есть описание интерфейса

Код: pascal
1.
2.
3.
4.
5.
6.
type
  ILibEntryPoint = interface
  ['{********-*******-*******-**********}']
    procedure Init; safecall;
    procedure Done; safecall;
  end;




В главном модуле

Код: pascal
1.
2.
3.
4.
  private
........
 //   FLibEntryPoint: ILibEntryPoint;
    FDLLEntryPoint: IUnknown;



при создании главного модуля
можно-ли сделать так?:
Код: pascal
1.
2.
3.
4.
................
 FDLLEntryPoint:=Un_API_DLL1.ILibEntryPoint; // тут ошибка [Pascal Error] .... Incompatible types: 'IInterface' and 'TGUID'
 Un_API_DLL1.ILibEntryPoint(FDLLEntryPoint).Init;
..............
...
Рейтинг: 0 / 0
По интерфейсам IUnknown
    #40076024
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо экземпляра класса реализующего интерфейс вы присваиваете сам интерфейс...


Надо что-то вроде

Код: pascal
1.
2.
3.
4.
TSomeClass = class(TInterfacedObject, ILibEntryPoint)
end;

FDLLEntryPoint := TSomeClass.Create();
...
Рейтинг: 0 / 0
По интерфейсам IUnknown
    #40076071
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял идею, то вам нужно сделать следующее

1. Реализовать ваш интерфейс в dll
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TLibEntryPoint = class(TInterfacedObject, ILibEntryPoint)
    procedure Init; safecall;
    procedure Done; safecall;
end;

procedure TLibEntryPoint.Init;
begin
  ...
end;

procedure TLibEntryPoint.Done; 
begin
  ...
end;

2. Экспортировать из dll функцию, которая вернет экземпляр этого интерфейса
Код: pascal
1.
2.
3.
4.
function GetLibEntryPoint: ILibEntryPoint; stdcall; export;
begin
  Result := TLibEntryPoint.Create;
end;

3. В основном приложении вызвать эту функцию и получить экземпляр
Код: pascal
1.
2.
3.
4.
5.
function GetLibEntryPoint: ILibEntryPoint; stdcall; external 'api1.dll';

    FLibEntryPoint: ILibEntryPoint;

FDLLEntryPoint := GetLibEntryPoint;

4. А потом уже вызывать методы
Код: pascal
1.
2.
3.
FDLLEntryPoint.Init;
.........
FDLLEntryPoint.Done;
...
Рейтинг: 0 / 0
По интерфейсам IUnknown
    #40076113
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Они у меня реализованы, т. е. есть четыре DLL, работающие с фискальными регистраторами (Atol8, Atol10, Штрих и Пионер114). Методы взаимодействия везде одинаковы, вот я и озадачился сделать какую-то унификацию. Т.е. из единого модуля управлять четырьмя разными интерфейсами (так-же как, например, четырьмя разными формами, наследниками TForm можно управлять через переменную, объявленную как TForm).
...
Рейтинг: 0 / 0
По интерфейсам IUnknown
    #40076137
Benten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zeon11,

Унификацию не просто можно, но и надо сделать.
Сейчас у вас есть четыре dll, которые реализуют один и тот же интерфейс обмена данными с ККТ разных производителей:
  • atol8.dll
  • atol10.dll
  • shtrih.dll
  • pioneer.dll
Теперь осталось самое малое, в основной программе, откуда вызываются эти интерфейсы из разных dll, перед
выбором нужного ККТ, создать интерфейс ККТ, заданной в настройках основной программы.


Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
  
type
  IKKTInteface = interface
  ['{********-*******-*******-**********}']
    procedure AddProduct;
    procedure CreateCheck;
    procedure CreateZReport;
  end;


  //  Общий интерфейс для работы со всеми ККТ  
  TKKTInterface = class(TInterfacedObject, IKKTInteface)
  private
    FName: String;
  public

  end;

  TKKTATOL8 = class(TKKTInteКface, IKKTInteface)
  public
    // Методы, реализующие работу с ККТ АТОЛ 8
    function  AddProduct;
    function  CreateCheck;
    function  CreateZReport;
    // ....
  end;

  TKKTATOL10 = class(TKKTInteКface, IKKTInteface) 
  public
    // Методы, реализующие работу с ККТ АТОЛ 10
    function  AddProduct;
    function  CreateCheck;
    function  CreateZReport;
    // ....
  end;

  TKKTShtrih= class(TKKTInteКface, IKKTInteface) 
  public
    // Методы, реализующие работу с ККТ Штрихъ
    function  AddProduct;
    function  CreateCheck;
    function  CreateZReport;
    // ....
  end;

  TKKTPioneer= class(TKKTInteКface, IKKTInteface) 
  public
    // Методы, реализующие работу с ККТ Пионер
    function  AddProduct;
    function  CreateCheck;
    function  CreateZReport;
    // ....
  end;



procedure SetKKTType();
var
  KKT: IKKTInteface;
begin
   if Settings.Name = 'DTO8' then
     KKT := TKKTATOL8.Create
   else if Settings.Name = 'DTO10' then
     KKT := TKKTATOL10.Create
   else if Settings.Name = 'SHTRIH' then
     KKT := TKKTShtrih.Create
   else if Settings.Name = 'PIONEER' then
     KKT := TKKTPioneer.Create;
end;
...
Рейтинг: 0 / 0
По интерфейсам IUnknown
    #40076143
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11
Они у меня реализованы,
Отлично! Первый пункт выполнен. Осталось еще три.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / По интерфейсам IUnknown
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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