Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi COM Interface / pdfMachine (https://www.delphipraxis.net/74197-com-interface-pdfmachine.html)

skyware 30. Jul 2006 11:58


COM Interface / pdfMachine
 
Hallo zusammen,

ich versuche mich gerade im ersteller eines COM Interfaces.
Leider hab ich das noch nie gemacht, und habe dazu ein paar Fragen.

Grundsätzlich möchte ich ein Programm machen das sich in die PDF Machine Software einklinkt
( http://www.pdfmachine.com ).

Dazu habe ich folgende Infos gefunden:

http://www.pdfmachine.com/genp/customToolbar.html

Die benötigten Registry Einträge konnte ich erfolgreich machen, und sehe diese neuen Buttons jetzt auch.

Mein Problem ist allerdings der Abschnitt "COM Interface - click handler".
Hier verstehe ich nicht genau was für eine Art Projekt ich jetzt im Delphi anlegen muss "Neu-Weitere-ActiveX-?"
Geschweige denn welche Parameter ich bei den Funktionen angeben muss?

Kann mir hier jemand unter die Arme greifen? :gruebel:


Gruss und Danke

DGL-luke 30. Jul 2006 12:12

Re: COM Interface / pdfMachine
 
ActiveX musst du nur machen, wenn du selber n ActiveX-Control machen willst, glaub ich mal...

Es sollte schon so funktionieren:

Delphi-Quellcode:
type
  IMyPDFMachineInterface = interface(IDispatch)
    procedure clicked(ButtonText, pdfMachineViewer: TVariant); //Variant weil ioch nicht weiss was das für datentypen sien müssen... da muss du dich selber noch ein wenig einlesen ;)
  end;

  TMachinePDFHandler = class(TObject, IMyPDFMachineInterface);
    //implement IMyPDFMachineInterface
    procedure clicked(ButtonText, pdfMachineViewer: TVariant);
  end;
Dann musst du nur noch ein Object erzeugen und als Interface bei Machine PDF bekannt machen.

Eventuell must du wirklcih ein OLE-Objekt registrieren... da kenn ich mich nicht aus...

EDIT: OK, du musst das wirklcih als komplettes OLE-Objekt bauen. da kann ich dir nicht helfen, sry, aber das codeschnipsel oben gehört auch dazu ;)

skyware 16. Aug 2006 10:34

Re: COM Interface / pdfMachine
 
*push* hat wirklich niemand eine Ahnung wie ich diesen COM-Server implementieren muss?

shmia 16. Aug 2006 10:54

Re: COM Interface / pdfMachine
 
Du fängst ohne Projekt an.
Datei -> Neu -> ActiveX -> ActiveX-Bibliothek (also eine DLL)
dann
Datei -> Neu -> ActiveX -> Automatisierungsobjekt
Name der CoClass: "PdfButton"

Es wird der TLB-Editor angezeigt.
Du wählst das Interface "IPdfButton" und wählst "neue Methode"
Die Methode bekommt den Namen "Clicked"
Auf der Seite Parameter fügst du 2 neue Parameter hinzu:
Name: "buttonText" Typ: BSTR
Name: "pdfMachineviewer" Typ: IDispatch *

Im TLB-Editor drückst du auf Implementierung aktualisieren
Delphi generiert dir folgenden Sourcecode:
Delphi-Quellcode:
procedure TPdfButton.Clicked(const buttonText: WideString;
  const pdfMachineviewer: IDispatch);
begin
   // und hier musst du dann weitermachen
end;

skyware 16. Aug 2006 11:35

Re: COM Interface / pdfMachine
 
Liste der Anhänge anzeigen (Anzahl: 2)
hallo shmia,

danke für die rasche Antwort! Ich hab das jetzt mal gemäss Deinen Vorgaben versucht.
Das erstellen des COM-Servers hat wunderbar funktioniert.

Leider funktioniert irgendwas doch noch nicht ganz...anbei mal der Source Code und die Fehlermeldung die mir die PDFMachine auslöst.

Was könnte ich noch falsch gemacht haben? :wall:

Die Einstellungen gemäss http://www.pdfmachine.com/genp/customToolbar.html habe ich auch gemacht.

als Wert im "extraButtonsComHandler" habe ich "HorizonPDFMachine.dll" eingetragen.
Der Button ist sonst richtig eingetragen, sonst würde er ja in der PDFMachine nicht ersichtlich sein.

hmm... Ideen? :gruebel:

Mit der "*.WSC - Datei" Methode habe ich es auch versucht, das scheint zu funktionieren.

shmia 16. Aug 2006 12:37

Re: COM Interface / pdfMachine
 
Zitat:

Zitat von skyware
als Wert im "extraButtonsComHandler" habe ich "HorizonPDFMachine.dll" eingetragen.

Das ist wohl nicht ganz richtig; du musst nicht den Namen der DLL, sondern die ClassId deiner Klasse eintragen.
Hier deine TLB-Datei (im IDL-format):
Code:
library HorizonPDFMachine
{
    // TLib :    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");

    // Forward declare all types defined in this typelib
    interface IPdfButton;

    [
      odl,
      uuid(569A5C4B-839E-4199-87DC-6385C39577E6),
      version(1.0),
      helpstring("Dispatch-Schnittstelle für PdfButton-Objekt"),
      dual,
      oleautomation
    ]
    interface IPdfButton : IDispatch {
        [id(0x00000001)]
        HRESULT clicked(
                        [in] BSTR buttonText,
                        [in] IDispatch* pdfMachineviewer);
    };

    [
      uuid(F557474E-27A7-44E7-8B04-263351DCA7BD),
      version(1.0),
      helpstring("PdfButton Objekt")
    ]
    coclass PdfButton {
        [default] interface IPdfButton;
    };
};
Deine Bibliothek heisst HorizonPDFMachine, deine CoClass heisst PdfButton
=> ClassID = 'HorizonPDFMachine.PdfButton'
Windows findet deine DLL über Einträge in der Registry/COM-Datenbank.
Dazu musst du sie aber registrieren mit RegSvr32.exe oder in Delphi mit Start->ActiveX Server eintragen

skyware 16. Aug 2006 12:50

Re: COM Interface / pdfMachine
 
:dancer: wunderbar, das funktioniert!

Vielen Dank für die schnelle und professionelle Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.

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