Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Globales Interface erzeugen (https://www.delphipraxis.net/168875-globales-interface-erzeugen.html)

Mavarik 15. Jun 2012 13:15

Globales Interface erzeugen
 
Hallo Zusammen!

Ich habe gerade einen "Hänger"..

ich habe ein Interface erzeugt...

Delphi-Quellcode:
  IVVComInterface = interface(IInvokable)
   ['{DDDD293D-1D84-49AC-8B91-9403898D7872}']
    { Methoden von Invokable-Interface dürfen nicht die Vorgabe- }
    { Aufrufkonvention verwenden; stdcall wird empfohlen }
    Function Commando(Aktion:byte):AnsiString; stdcall;
  end;
Und ein "Server-Form" erzeugt mit:

Delphi-Quellcode:
  TForm47 = class(TForm,IVVComInterface)
...
  InvRegistry.RegisterInterface(TypeInfo(IVVComInterface));
Ein Zugriff auf dieses Interface versuche ich mit:

Delphi-Quellcode:
Var
  ServerLink : IVVComInterface;
  MyGuid    : TGuid;
begin
  MyGuid := StringtoGuid('{DDDD293D-1D84-49AC-8B91-9403898D7872}');
  if QueryInterface(MyGuid,Serverlink) = 0 then
    ServerLink.Commando(1);
Aber das Interface wird nicht gefunden! Was habe ich übersehen?

Grüsse Mavarik

NickelM 15. Jun 2012 13:45

AW: Globales Interface erzeugen
 
Es gibt 2 unterschiedliche Interface-"Arten"

- Einmal Interfaces, die in einer ActiveX-Dll sind. Diese werden meistens über CoCreateInstance erstellt. Diese Interfaces haben schon Funktionsabläufe, vielleicht sogar Events. Auf diese Events kann man nur zugreifen, wenn man das Interface in eine Klasse packt.
- Das Zweite sind Interfaces, die als eine "abtrakte" Klasse dienen. Also nur Funktionsnamen vorgeben. Diese bekommen erst eine Funktion, wenn sie in eine Klasse eingebunden werden.

Soweit zur erklären Allgemein. In deinem Fall würde das ganze so Ausehen:
Delphi-Quellcode:
TForm47 = class(TForm,IVVComInterface)
Function Commando(Aktion:byte):AnsiString; stdcall; //Ich würde AnsiString zu PAnsiChar machen, da sich Strings in DLL sich nicht so gut machen.
end;

Var
  ServerLink : TForm47;
  ServerLinkInterface : IVVComInterface;
  MyGuid : TGuid;
begin
  //Erstele Variante
  ServerLink := TForm47.Create; //Falls es nicht schon irgendwo steht
  ServerLink.Commando(1); //Da du das Interface mit der Klasse verbunden hast kannst du ganz normal auf die Funktionen zugreifen
  //Zweite Variant
  MyGuid := StringtoGuid('{DDDD293D-1D84-49AC-8B91-9403898D7872}');
  CoCreateInstance(MyGuid,nil,IVVComInterface,ServerLinkInterface);
  ServerLinkInterface.Commando(1);
Wenn ich das richtig verstehe, willst du eine ActiveX-Dll bauen bzw. einbinden.
Also wäre in diesem Fall Variante 1 ratsam.

EWeiss 15. Jun 2012 14:30

AW: Globales Interface erzeugen
 
versuch die DLL doch mal von Hand zu Registrieren
regserv.. bla bla

gruss

Neutral General 15. Jun 2012 14:47

AW: Globales Interface erzeugen
 
Zitat:

regsvr32 DllName.dll
Am besten mit Adminrechten!

Mavarik 15. Jun 2012 14:59

AW: Globales Interface erzeugen
 
Danke erstmal für die Infos...

CoCreateInstance funktioniert so nicht...

Ist auch keine DLL sonderne eine Exe und ich will auf keinen Fall die miot Regsvr erst registrieren müssen...

Mavarik

EWeiss 15. Jun 2012 15:11

AW: Globales Interface erzeugen
 
Zitat:

Zitat von Mavarik (Beitrag 1171054)
Danke erstmal für die Infos...

CoCreateInstance funktioniert so nicht...

Ist auch keine DLL sonderne eine Exe und ich will auf keinen Fall die miot Regsvr erst registrieren müssen...

Mavarik

Wie willst dann an dein Interface kommen wenn diese nicht public sind? :gruebel:
Zitat:

Aber das Interface wird nicht gefunden! Was habe ich übersehen?

gruss

shmia 15. Jun 2012 15:58

AW: Globales Interface erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So wird das nix.
Anwendungen, die von Aussen per ActiveX gesteuert werden sollen brauchen eine Typbibliothek und duale Interfaces.

Im Anhang ist Sourcecode zu einer Testanwendung.
Compilieren, Starten und dann das beiliegende VB-Script starten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz