AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit COM Anwendung

Ein Thema von MechMac666 · begonnen am 3. Sep 2019 · letzter Beitrag vom 5. Sep 2019
Antwort Antwort
MechMac666

Registriert seit: 9. Nov 2008
95 Beiträge
 
#1

Probleme mit COM Anwendung

  Alt 3. Sep 2019, 20:10
Hallo,

ich möchte ein Addon erstellen, welches per COM mit der Hostanwendung kommuniziert.
Die Anwendung ist eine ActiveX Bibliothek.
Die Hostanwendung ist Autodesk Inventor 2013. Sie stellt eine Typenbibliothek zur Verfügung, welche von dem Addon verwendet werden kann.
Ich muss dazu sagen das das für mich Neuland ist. Leider habe ich dazu nicht wirklich viel gefunden.
Es gibt ein (altes) Beispiel:
https://forums.autodesk.com/t5/inven...hi/td-p/761778

Dort schreiben sie noch über Probleme mit dem Interface_IRxApplicationAddInServer.
Mittlerweile ist es jedoch so das IRxApplicationAddInServer existiert (ohne den Unterstrich)
Des weiteren habe ich in der "Inventor_TLB.pas" eine Definition von "ApplicationAddInSite" gefunden, welche wohl auch Korrekt ist.

Jetzt mein Vorgehen:
Ich habe eine leere ActiveX Lib erzeugt und habe in der RIDL bei Verwendung ein Häkchen bei Inventer Object Library gesetzt.
Dann habe ich eine COClass erzeugt und hier musste ich etwas tricksen. Das IRxApplicationAddInServer konnte ich nicht als zu implementierendes Interface auswählen, ich nahm ein anderes und habe den Code manuell angepasst, sprich ich habe die Procedur-Header aus der Typenbibliothek verwendet etc.
Soweit so gut.
Das Teil kompiliert nun, jedoch kann ich die von mir erzeugte Lib nicht registrieren lassen (regsvr32 ...)
Es scheitert im Abschnitt initialization.
Wenn ich den Auskommentiere klappt die Registrierung, also muss es damit etwas zu tun haben.

Hinweis:
In den Codes steht manchmal in den Kommentaren noch "AIMDAddInLib"
Das war diese Sache mit dem tricksen. die "AIMDAddInLib" wurde von mir durch "IRxApplicationAddInServer" ersetzt.

Hier der Code von der main Unit.
Der Fehler wird vermutlich beim erstellen von TTAppAddInServ auftreten.
Ich weiß nicht wo ich da anfangen soll zu suchen.


Code:
unit main;

{$WARN SYMBOL_PLATFORM OFF}

interface



uses
  ComObj, ActiveX, skg_lib_TLB, Inventor_TLB, StdVcl,
  Winapi.Windows, Winapi.Messages, System.Variants, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TTAppAddInServ = class(TAutoObject, IRxApplicationAddInServer)
  protected
    function Get_Automation(out AutomationPtr: AddInAutomation): HResult;stdcall;
    function Activate(const pAddInSite: IRxApplicationAddInSite; FirstTime: BooleanType): HResult; stdcall;
    function Deactivate: HResult; stdcall;
    function ExecuteCommand(CommandID: Integer): HResult; stdcall;
  end;

var
  oInventor : Inventor_TLB.Application;
  oCmd1 : Inventor_TLB.Command;

implementation

uses ComServ;





function TTAppAddInServ.Get_Automation(out AutomationPtr: AddInAutomation): HResult;
begin
  Result := E_NOINTERFACE;
end;



function TTAppAddInServ.Activate(const pAddInSite: IRxApplicationAddInSite; FirstTime: BooleanType): HResult; stdcall;
begin
  //init
  //AppDefault := InitApplication;
  //get the InventorObject
  //oInventor := pAddInSite.Get_Application(???) ;
  //Create commands
  //oCmd1 := pAddInSite.CreateCommand('My Add In Command',1,True,IUnknown );
  showmessage('hallo');
  Result := S_OK;
end;



function TTAppAddInServ.Deactivate: HResult;
begin
  //CleanUp
  oInventor := nil;
  oCmd1 := nil;
  Result := S_OK;
end;


function TTAppAddInServ.ExecuteCommand(CommandID: Integer): HResult;
begin
  Case CommandID of
  1: begin
  //here your Code for your command
  end;
  end;
  Result := S_OK;
end;

initialization
  TAutoObjectFactory.Create(ComServer, TTAppAddInServ, Class_TAppAddInServ,
  ciMultiInstance, tmApartment);

end.


Und hier ist noch die Projektdatei:

Code:
library SKG_INV_ADDON;

uses
  ComServ,
  skg_lib_TLB in 'skg_lib_TLB.pas',
  main in 'main.pas' {TAppAddInServ: CoClass};

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall;

{$R *.TLB}

{$R *.RES}

begin
end.



Und die RIDL gibts hier auch noch:


Code:
// ************************************************************************ //
// WARNUNG
// -------
// Diese Datei wird von dem Typbibliotheks-Importer oder dem Typbibliothekseditor
// erzeugt. Außer Syntaxfehlern analysiert der Editor an der Datei vorgenommene
// Änderungen. Wenn Sie aber Änderungen mit dem Editor vornehmen, wird diese
// Datei neu erzeugt und Kommentare oder Formatänderungen gehen verloren.
// ************************************************************************ //
// Datei erzeugt am 03.09.2019 10:32:22 (- $Rev: 12980 $, 16593514).

[
  uuid(6F58D4C7-4BE5-48C2-9F71-B1BBD18A9EDD),
  version(1.0)

]
library skg_lib
{

  importlib("stdole2.tlb");
  importlib("RxInventor.tlb");

  coclass TAppAddInServ;


  [
    uuid(CF9F95ED-6F73-4055-8357-D707AD9C1222),
    helpstring("TAppAddInServ")
  ]
  coclass TAppAddInServ
  {
  };

};


Und die skg_lib_TLB


Code:
unit skg_lib_TLB;

// ************************************************************************ //
// WARNUNG
// -------
// Die in dieser Datei deklarierten Typen wurden aus Daten einer Typbibliothek
// generiert. Wenn diese Typbibliothek explizit oder indirekt (über eine
// andere Typbibliothek) reimportiert wird oder wenn der Befehl
// 'Aktualisieren' im Typbibliotheks-Editor während des Bearbeitens der
// Typbibliothek aktiviert ist, wird der Inhalt dieser Datei neu generiert und
// alle manuell vorgenommenen Änderungen gehen verloren.
// ************************************************************************ //

// $Rev: 52393 $
// Datei am 03.09.2019 06:58:46 erzeugt aus der unten beschriebenen Typbibliothek.

// ************************************************************************  //
// Typbib.: C:\Users\.....\INV_addon 3\skg_lib (1)
// LIBID: {6F58D4C7-4BE5-48C2-9F71-B1BBD18A9EDD}
// LCID: 0
// Hilfedatei:
// Hilfe-String:
// Liste der Abhäng.:
//   (1) v2.0 stdole, (C:\Windows\SysWOW64\stdole2.tlb)
//   (2) v1.0 Inventor, (C:\Program Files\Autodesk\Inventor 2013\Bin\bin32\RxInventor.tlb)
//   (3) v1.0 AIMDAddInLib, (C:\Program Files (x86)\Autodesk\Productstream Professional 2011\cai\aim_dlls\AIMDAddIn_Inv13_x64.dll)
// SYS_KIND: SYS_WIN32
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit muss ohne Typüberprüfung für Zeiger compiliert werden.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
{$ALIGN 4}

interface

uses Winapi.Windows, Inventor_TLB, System.Classes, System.Variants, System.Win.StdVCL, Vcl.Graphics, Vcl.OleServer,
Winapi.ActiveX;

// *********************************************************************//
// In der Typbibliothek deklarierte GUIDS. Die folgenden Präfixe werden verwendet:
//   Typbibliotheken     : LIBID_xxxx
//   CoClasses           : CLASS_xxxx
//   DISPInterfaces      : DIID_xxxx
//   Nicht-DISP-Interfaces: IID_xxxx
// *********************************************************************//
const
  // Haupt- und Nebenversionen der Typbibliothek
  skg_libMajorVersion = 1;
  skg_libMinorVersion = 0;

  LIBID_skg_lib: TGUID = '{6F58D4C7-4BE5-48C2-9F71-B1BBD18A9EDD}';

  CLASS_TAppAddInServ: TGUID = '{CF9F95ED-6F73-4055-8357-D707AD9C1222}';
type

// *********************************************************************//
// Deklaration von in der Typbibliothek definierten CoClasses
// (HINWEIS: Hier wird jede CoClass ihrem Standard-Interface zugewiesen)
// *********************************************************************//
  TAppAddInServ = IRxApplicationAddInServer;


// *********************************************************************//
// Die Klasse CoTAppAddInServ stellt die Methoden Create und CreateRemote zur
// Verfügung, um Instanzen des Standard-Interface IAIMDAddInServer, dargestellt
// von CoClass TAppAddInServ, zu erzeugen. Diese Funktionen können
// von einem Client verwendet werden, der die CoClasses automatisieren
// will, die von dieser Typbibliothek dargestellt werden.
// *********************************************************************//
  CoTAppAddInServ = class
    class function Create: IRxApplicationAddInServer;
    class function CreateRemote(const MachineName: string): IRxApplicationAddInServer;
  end;

implementation

uses System.Win.ComObj;

class function CoTAppAddInServ.Create: IRxApplicationAddInServer;
begin
  Result := CreateComObject(CLASS_TAppAddInServ) as IRxApplicationAddInServer;
end;

class function CoTAppAddInServ.CreateRemote(const MachineName: string): IRxApplicationAddInServer;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_TAppAddInServ) as IRxApplicationAddInServer;
end;

end.



Gruß, Andreas

Geändert von MechMac666 ( 3. Sep 2019 um 20:19 Uhr)
  Mit Zitat antworten Zitat
ptietke

Registriert seit: 7. Sep 2006
8 Beiträge
 
#2

AW: Probleme mit COM Anwendung

  Alt 4. Sep 2019, 12:30
Hallo, bitte einmal probieren:

1. Im Menü unter Komponente / Komponente importieren.
2. ActiveX - Steuerelement importieren
3. "Inventor???" Komponete in Liste auswählen
4. [Weiter]
5. Im Dialog [X] Komponeten-Wrapper generieren
6. [Weiter]
7. [X] Unit anlegen
  Mit Zitat antworten Zitat
MechMac666

Registriert seit: 9. Nov 2008
95 Beiträge
 
#3

AW: Probleme mit COM Anwendung

  Alt 4. Sep 2019, 12:45
Du möchtest das ich die Typenbibliothek inventor_tlb.pas neu erzeugen lasse?

In der gegenwärtigen Datei steht aber:
// Datei am 03.09.2019 10:31:45 erzeugt aus der unten beschriebenen Typbibliothek.

Das bedeutet doch das sie neu ist.

Falls Du etwas anderes beabsichtigst, habe ich es nicht verstanden.

Gruß, Andreas



PS.: hab gerade nachgeschaut: Unter ActiveX gibt es nix passendes. Und wenn ich Typenbibliothek wähle, ist da nur die
Inventor Object Library (RxInventor.tlb)


Nur wie gesagt, in der aktuellen inventor_tlb.pas steht:
Code:
// Datei am 03.09.2019 10:31:45 erzeugt aus der unten beschriebenen Typbibliothek.

// ************************************************************************  //
// Typbib.: C:\Program Files\Autodesk\Inventor 2013\Bin\bin32\RxInventor.tlb (1)

Geändert von MechMac666 ( 4. Sep 2019 um 12:53 Uhr)
  Mit Zitat antworten Zitat
ptietke

Registriert seit: 7. Sep 2006
8 Beiträge
 
#4

AW: Probleme mit COM Anwendung

  Alt 4. Sep 2019, 21:04
Wenn das Interface Delphi nicht bekannt ist,
kannst du es über die .TLB neu importieren.

1. Im Menü unter Komponente / Komponente importieren.
2. Typbibliothek importieren
3. Button [Hinzufügen] und RxInventor.tlb hinzufügen
4. [Weiter]
5. Im Dialog [X] Komponeten-Wrapper generieren
6. [Weiter]
7. [X] Unit anlegen RxInventor.tlb --> RxInventor_TLB.pas (Wrapper für Delphi)


Dann neue RxInventor_TLB.pas in uses Teil hinzufügen
und das Interface über die CoClass erzeugen.

var
IAddInServer: IRxApplicationAddInServer;

IAddInServer := CoTAppAddInServ.Create;
  Mit Zitat antworten Zitat
MechMac666

Registriert seit: 9. Nov 2008
95 Beiträge
 
#5

AW: Probleme mit COM Anwendung

  Alt 5. Sep 2019, 09:22

7. [X] Unit anlegen RxInventor.tlb --> RxInventor_TLB.pas (Wrapper für Delphi)
Das importieren von RxInventor.tlb erzeugt aber die inventor_tlb.pas.
Die Unit steht bereits in der uses Klausel.

Das erzeugen über die CoClass hat nicht funktioniert. Angeblich sei die Klasse nicht registriert.


Folgendes ist mir aufgefallen:
in der skg_lib_TLB steht:

CLASS_TAppAddInServ: TGUID = '{CF9F95ED-6F73-4055-8357-D707AD9C1222}';


Diese GUID kann aber nicht existieren, denn es ist die GUID mit der ich eben dieses Projekt (*.dll) in der Windows Registry registrieren soll.
Was ich meine: Wenn ich regsvr32 ausführe und der Abschnitt "initialization" in der main.pas ausgeführt wird, steht da doch etwas von "Class_TAppAddInServ".
Das heißt er versucht auf etwas zuzugreifen was (noch) nicht in der Windows-registrierung existiert...


Hier die REG-Datei, da sieht man es:
(Wobei ich ja fest der Meinung bin, das da noch InpocServer32 mit dem Pfad zu der *.dll fehlt)
Code:
REGEDIT4

[HKEY_CURRENT_USER\Software\Classes\CLSID\{CF9F95ED-6F73-4055-8357-D707AD9C1222}]
@="SKG_INVADDON"

[HKEY_CURRENT_USER\Software\Classes\CLSID\{CF9F95ED-6F73-4055-8357-D707AD9C1222}\Description]
@="This sample demos skg addon."

[HKEY_CURRENT_USER\Software\Classes\CLSID\{CF9F95ED-6F73-4055-8357-D707AD9C1222}\Implemented Categories\{39AD2B5C-7A29-11D6-8E0A-0010B541CAA8}]

[HKEY_CURRENT_USER\Software\Classes\CLSID\{CF9F95ED-6F73-4055-8357-D707AD9C1222}\Settings]
"LoadOnStartUp"="1"
"Type"="Standard"
"Version"=dword:1
"SupportedSoftwareVersionGreaterThan"="14.."
  Mit Zitat antworten Zitat
ptietke

Registriert seit: 7. Sep 2006
8 Beiträge
 
#6

AW: Probleme mit COM Anwendung

  Alt 5. Sep 2019, 12:15
Es gibt ein Delphi Tool TRegSvr.exe dafür
Siehe unter:

http://docwiki.embarcadero.com/RADStudio/Rio/de/TRegSvr.exe:_Das_Hilfsprogramm_f%C3%BCr_die_Typbib liotheksregistrierung
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 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