Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / По интерфейсам IUnknown / 6 сообщений из 6, страница 1 из 1
07.06.2021, 10:47
    #40076018
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По интерфейсам IUnknown
Есть два однотипных модуля 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
07.06.2021, 11:15
    #40076024
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По интерфейсам IUnknown
Вместо экземпляра класса реализующего интерфейс вы присваиваете сам интерфейс...


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

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

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

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
07.06.2021, 14:02
    #40076113
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По интерфейсам IUnknown
_Vasilisk_,

Они у меня реализованы, т. е. есть четыре DLL, работающие с фискальными регистраторами (Atol8, Atol10, Штрих и Пионер114). Методы взаимодействия везде одинаковы, вот я и озадачился сделать какую-то унификацию. Т.е. из единого модуля управлять четырьмя разными интерфейсами (так-же как, например, четырьмя разными формами, наследниками TForm можно управлять через переменную, объявленную как TForm).
...
Рейтинг: 0 / 0
07.06.2021, 15:14
    #40076137
Benten
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По интерфейсам IUnknown
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
07.06.2021, 15:30
    #40076143
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
По интерфейсам IUnknown
zeon11
Они у меня реализованы,
Отлично! Первый пункт выполнен. Осталось еще три.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / По интерфейсам IUnknown / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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