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

Откуда: Сибирь, Кемерово
Сообщений: 1285
Есть два однотипных модуля Un_API_DLL1 и Un_API_DLL2.
В каждом есть описание интерфейса

type
  ILibEntryPoint = interface
  ['{********-*******-*******-**********}']
    procedure Init; safecall;
    procedure Done; safecall;
  end;



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

  private
........
 //   FLibEntryPoint: ILibEntryPoint;
    FDLLEntryPoint: IUnknown;


при создании главного модуля
можно-ли сделать так?:
................
 FDLLEntryPoint:=Un_API_DLL1.ILibEntryPoint; // тут ошибка [Pascal Error] .... Incompatible types: 'IInterface' and 'TGUID'
 Un_API_DLL1.ILibEntryPoint(FDLLEntryPoint).Init;
..............
7 июн 21, 10:47    [22332128]     Ответить | Цитировать Сообщить модератору
 Re: По интерфейсам IUnknown  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1834
Вместо экземпляра класса реализующего интерфейс вы присваиваете сам интерфейс...


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

TSomeClass = class(TInterfacedObject, ILibEntryPoint)
end;

FDLLEntryPoint := TSomeClass.Create();
7 июн 21, 11:15    [22332146]     Ответить | Цитировать Сообщить модератору
 Re: По интерфейсам IUnknown  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12901
Если я правильно понял идею, то вам нужно сделать следующее

1. Реализовать ваш интерфейс в dll
TLibEntryPoint = class(TInterfacedObject, ILibEntryPoint)
    procedure Init; safecall;
    procedure Done; safecall;
end;

procedure TLibEntryPoint.Init;
begin
  ...
end;

procedure TLibEntryPoint.Done; 
begin
  ...
end;
2. Экспортировать из dll функцию, которая вернет экземпляр этого интерфейса
function GetLibEntryPoint: ILibEntryPoint; stdcall; export;
begin
  Result := TLibEntryPoint.Create;
end;
3. В основном приложении вызвать эту функцию и получить экземпляр
function GetLibEntryPoint: ILibEntryPoint; stdcall; external 'api1.dll';

    FLibEntryPoint: ILibEntryPoint;

FDLLEntryPoint := GetLibEntryPoint;
4. А потом уже вызывать методы
FDLLEntryPoint.Init;
.........
FDLLEntryPoint.Done;


Сообщение было отредактировано: 7 июн 21, 12:37
7 июн 21, 12:46    [22332218]     Ответить | Цитировать Сообщить модератору
 Re: По интерфейсам IUnknown  [new]
zeon11
Member

Откуда: Сибирь, Кемерово
Сообщений: 1285
_Vasilisk_,

Они у меня реализованы, т. е. есть четыре DLL, работающие с фискальными регистраторами (Atol8, Atol10, Штрих и Пионер114). Методы взаимодействия везде одинаковы, вот я и озадачился сделать какую-то унификацию. Т.е. из единого модуля управлять четырьмя разными интерфейсами (так-же как, например, четырьмя разными формами, наследниками TForm можно управлять через переменную, объявленную как TForm).
7 июн 21, 14:02    [22332291]     Ответить | Цитировать Сообщить модератору
 Re: По интерфейсам IUnknown  [new]
Benten
Member

Откуда: Россия, Крым
Сообщений: 26
zeon11,

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


  
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;
7 июн 21, 15:14    [22332352]     Ответить | Цитировать Сообщить модератору
 Re: По интерфейсам IUnknown  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12901
zeon11
Они у меня реализованы,
Отлично! Первый пункт выполнен. Осталось еще три.
7 июн 21, 15:30    [22332363]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить