Announcement

Collapse
No announcement yet.

Wie erstelle ich eine ActiveX-DLL?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie erstelle ich eine ActiveX-DLL?

    Hallo,

    ich möchte eine ActiveX-DLL in Delphi 6 erstellen, welche ich dann aus einem VBScript aufrufen möchte.

    Diese DLL soll einfach ein Grid beinhalten, wobei dieses dann Daten aus einer Datenbank enthalten soll. Der Datenzugriff ist dabei weniger das Problem!

    Wichtiger für mich ist das erstellen der DLL bzw. der Aufruf dieser DLL aus VBScript!

    Ist dies mit Delphi überhaupt möglich? Wenn ja, wie könnte man das realisieren?

    Vielen Dank schon mal im Vorraus!!!

  • #2
    Hallo,

    >Ist dies mit Delphi überhaupt möglich?

    Ja.

    >Wenn ja, wie könnte man das realisieren?

    In Delphi 6 wird zuerst ein <b>ActiveX-Bibliothek</b>-Projekt angelegt. Diesem Projekt wird über <i>Datei | Neu | Weitere</i> ein <b>Automatisierungsobjekt</b> zugeordnet. In meinem Beispiel erhält dieses den Namen <i>VBAruftDelphi</i>. Wenn der Dialog mit OK bestätigt wird, erscheint der <i>Typbibliotheks-Editor</i>. Dort muss man für das Interface (<i>IVBAruftDelphi</i>) die Methoden definieren (Name, Rückgabewert und Parameter), die später u.a. vom VBA-Script aufgerufen werden sollen. Wenn das erledigt ist, klickt man im <i>Typbibliotheks-Editor</i> den Button <b>Implementierung aktualisieren</b> an. Delphi legt dann das folgende Grundgerüst an:
    <pre>
    <b>unit</b> Unit1;
    <br>
    <font color="#003399"><i>{$WARN SYMBOL_PLATFORM OFF}</i></font>
    <br>
    <b>interface</b>
    <br>
    <b>uses</b>
    ComObj, ActiveX, Project1_TLB, StdVcl;
    <br>
    <b>type</b>
    TVBAruftDelphi = <b>class</b>(TAutoObject, IVBAruftDelphi)
    <b>protected</b>
    <b>procedure</b> Demo(sInput: Integer); <b>safecall</b>;
    <font color="#003399"><i>{ Protected-Deklarationen }</i></font>
    <b>end</b>;
    <br>
    <b>implementation</b>
    <br>
    <b>uses</b> ComServ;
    <br>
    <b>procedure</b> TVBAruftDelphi.Demo(sInput: Integer);
    <b>begin</b>
    <br>
    <b>end</b>;
    <br>
    <b>initialization</b>
    TAutoObjectFactory.Create(ComServer, TVBAruftDelphi, Class_VBAruftDelphi,
    ciMultiInstance, tmApartment);
    <b>end</b>.
    </pre>
    Nun kann man die benötigten Formulare hinzufügen, um dann die Interface-Methode zu erweitern:
    <pre>
    <b>uses</b> ComServ, FrmInCOMSrv_Frm, Controls, Windows, Forms;
    <br>
    <b>procedure</b> TVBAruftDelphi.Demo(sInput: Integer);
    <b>begin</b>
    FormSrvDlg := TFormSrvDlg.Create(<b>nil</b>);
    <b>try</b>
    FormSrvDlg.ShowModal;
    <b>finally</b>
    FormSrvDlg.Release
    <b>end</b>;
    <b>end</b>;
    </pre>
    Ausführlicher ist das Ganze in meinem Buch <i>http://www.software-support.biz/sus/sus_buch/psecom,id,4,nodeid,11,_language,de.html</i> nachzulesen

    Comment


    • #3
      Guten Abend Herr Kosch,

      recht vielen Dank für die schnelle Antwort und mit solch detaillierter Antwort habe ich ehrlich gesagt auch nicht gerechnet. Aber so ist es um so besser.

      Es ist schön sich auf solche Foren verlassen zu können.

      Vielen Dank nochmal und macht weiter so...
      Das Resultat lass ich Euch natürlich wissen.

      Gruß
      Michael Ber

      Comment


      • #4
        Ach und noch etwas. Habe mir eben den o.g. Link angeschaut und wollte Sie fragen, ob sich dieses Buch auch für Delphi 6 Entwickler lohnt. Die Thematik ist äußerst interessant.

        Viele Grüße aus Dresden
        M.Ber

        Comment


        • #5
          Hallo,

          &gt;..ob sich dieses Buch auch für Delphi 6 Entwickler lohnt.

          das Buch berücksichtigt in den beigefügten Beispielen Delphi 3.02, Delphi 4.02 und Delphi 5.x. Ab der Version 5 (Delphi 6/7) hat Borland in diesem Bereich aber fast nichts mehr geändert, so dass sich alle Delphi 5-Beispiele auch mit Delphi 6/7 verwenden lassen. Erst mit Delphi 2005 lassen sich in einem Win32-Projekt nicht mehr alle Beispiele aus dem Buch nachbauen

          Comment


          • #6
            Sehr gut, dann werde ich mir dieses Buch bestellen. Vielen Dank für die Informationen und die Hilfe

            Comment


            • #7
              Hallo Herr Kosch,

              ich habe beim Testen noch ein kleines Problem entdeckt. Ich habe eine Methode für das Interface hinzugefügt mit Namen und Parameter. Jedoch konnte ich keinen String übergeben.

              Ich muss aber dieser Methode einen String übergeben, da dieser Datentyp für den folgenden SQL-Filter leider ein String ist.

              Haben Sie noch eine Idee, wie ich dieses Problem beheben kann?

              Vielen Dank schonmal im Vorraus

              Grüße M.Ber

              Comment


              • #8
                Ich habe noch eine kleine Frage:

                Wie kann ich im Typenbibliotheks-Editor der Methode des Interfaces einen Stringwert übergeben? Ich habe leider nur IStrings etc. gefunden.

                Weiterhin weiß ich noch nicht, wie ich dann genau im VB Script diese DLL bzw. dieses Objekt aufrufe.
                In VBScript geschieht das ja dann mit CreateObject("...")usw.

                Ich hoffe wir haben uns da nicht missverstanden, da sie von VBA gesprochen haben. Dummerweise habe ich nicht so den Plan in VBScript / VBA!

                Vielen Dank nochmals.

                M.Ber

                Comment


                • #9
                  Hallo,

                  &gt;..einen Stringwert übergeben?

                  hier ist <b>WideString</b> genau richtig.

                  &gt;...wie ich dann genau im VB Script diese DLL bzw. dieses Objekt aufrufe.

                  Das könnte so aussehen, wobei die so genannte <i>ProgID</i> beim <b>CreateObject</b>-Aufruf verwendet wird:
                  <pre>
                  Set aObj = CreateObject("VBSCallDelphiForm.VBSCallDelphiFormO bj")
                  aObj.Formshow
                  MsgBox "VBScript ist fertig!"
                  </pre>
                  Die zu verwendende Zeichenkette - in meinem Beispiel <i>VBSCallDelphiForm.VBSCallDelphiFormObj</i> zeigt der Typbibliothek-Editor von Delphi an. Der Name setzt sich aus dem Name der TLB und dem Namen der CoClass zusammen (siehe angehängte Abbildung). Wenn das COM-Objekt registriert wird, trägt es sich so in der Registry ein, dass die ProgID gegen die verbindliche ClsID eingetauscht werden kann

                  Comment


                  • #10
                    Vielen Dank Herr Kosch,

                    es funktioniert hervorragend!

                    Schöne Grüße aus Dresden
                    M.Ber

                    Comment


                    • #11
                      hallo,

                      die dll habe nun auch! geht über den reiter activex bei projekt neu, aber wie weise ich dieser dll eine Program ID und eine Class ID zu?

                      Gruß und danke!

                      Marku
                      Herzliche Grüße

                      Markus Lemcke
                      barrierefreies Webdesign

                      Comment


                      • #12
                        Probiere mal, dem Projekt noch eine TypBibliothek hinzuzufügen (gleicher Karteireiter bei Datei Neu).<p>
                        Mari
                        Schöne Grüße, Mario

                        Comment


                        • #13
                          habe ich schon, aber da muss man dann auch an der RICHTIGEN stelle, das RICHTIGE eintragen

                          gruß

                          marku
                          Herzliche Grüße

                          Markus Lemcke
                          barrierefreies Webdesign

                          Comment

                          Working...
                          X