Announcement

Collapse
No announcement yet.

Wie erstelle ich eine Activex-dll für ASP-Komponenten?

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

  • Wie erstelle ich eine Activex-dll für ASP-Komponenten?


  • #2
    Hallo,

    wenn <b>Delphi 5 Enterprise</b> zur Verfügung steht, erledigt der Wizard alle notwendigen Schritte:<br>
    1. Datei Neu -> ActiveX -> <b>Active Server Object</b> <br>
    2. Option <b>Test-Script generieren</b> angewählt lassen <br>
    3. OK-Button <br>
    Der Wizard generiert den Quelltext sowohl für das COM-Objektt also auch gleichzeitig die <b>ASP</b>-Seite, in der dieses Objekt bereits erzeugt wird (der Rest ist den eingefügten Kommentaren zu entnehmen)

    Comment


    • #3
      und mit Delphi4 C/S

      Comment


      • #4
        Hallo,

        mit <b>Delphi 4</b> muß das ASP-Objekt von Hand zusammengebaut werden. Die einzelnen Schritte dazu sind wie folgt: <br>
        1. Datei -> Neu -> ActiveX -> ActiveX Bibliothek <br>
        2. Datei -> Neu -> ActiveX -> Automatisierungsobjekt <br>
        3. Interface des ASP-Objekt festlegen<br>
        4. Interface-Methoden implementieren<br>
        5. DLL compilieren und registrieren (Start -> ActiveX Server eintragen)<br>
        6. ASP-Script vorbereiten und im Web-Server plazieren.<br>
        7. ASP-Objekt im ASP-Script erzeugen: Set MyObjRef = Server.CreateObject("ShowFileName.SFNObj") <br>
        8. ASP-Script via Web-Browser aufrufen.

        Das könnte dann zum Beispiel so aussehen:

        <pre>
        unit ShowFileName;

        interface

        uses
        ComObj, ActiveX, ASPDirectory_TLB, ASPTypeLibrary_TLB;

        type
        TShowFileName = class(TAutoObject, IShowFileName)
        private
        FScriptingContext : IScriptingContext;
        protected
        procedure Display; safecall;
        function OnStartPage(var sc: IUnknown): Integer; safecall;
        end;

        implementation

        uses ComServ;

        procedure TShowFileName.Display;
        var
        mRequest: IRequest;
        mResponse : IResponse;
        begin
        mRequest := FScriptingContext.Request;
        mResponse := FScriptingContext.Response;
        mResponse.Write('....HTML-Gerüst...');
        mResponse.Write(mRequest.ServerVariables.Item['PATH_INFO']);
        ...
        end;

        function TShowFileName.OnStartPage(var sc: IUnknown): Integer;
        begin
        FScriptingContext := sc as IScriptingContext;
        Result := 0;
        end;

        initialization
        TAutoObjectFactory.Create(ComServer, TShowFileName, Class_ShowFileName,ciMultiInstance);
        end.
        </pre&gt

        Comment


        • #5
          Hallo Andreas,<br>
          folgendes Problem: wenn ich versuche mit dem Wizard ein Active Server Object zu erstellen, scheitere ich bei der Angabe von neuen Funktionen. Jedesmal, wenn ich als Rückgabetyp einer Methode etwas anderes als HRESULT angebe, kommt die Fehlermeldung "Die SafeCall-Nethode benötigt einen Rückgabewert vom Typ HRESULT". Ich möchte jedoch erreichen, daß mir die Methode das Ergebnis einer Datenbankabfrage in einen String oder Array zurückliefert, welchen ich dann in der ASP-Seite auslesen und auswerten kann. Was mache ich falsch ?<br>
          <br>
          MfG<br>
          Frank Ulm<br>
          P.S.: Ich benutzte Delphi 5.0 Professiona

          Comment


          • #6
            Hallo,

            die SafeCall-Beschränkung auf einen HRESULT-Rückgabewert ist kein Problem, da ein Output-Parameter im Interface über <b>out</b> deklariert werden kann:
            <pre>
            ITestASPObj = interface(IDispatch)
            ['{D96CC942-EF40-11D3-BF72-005004303872}']
            procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
            procedure OnEndPage; safecall;
            procedure NeueMethode(InputParam: Integer; out OutputParam: WideString); safecall;
            end;
            </pre>
            Die Implementierungs-Unit sieht in diesem Beispiel so aus:
            <pre>
            type
            TTestASPObj = class(TASPObject, ITestASPObj)
            protected
            procedure OnEndPage; safecall;
            procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
            procedure NeueMethode(InputParam: Integer; out OutputParam: WideString);
            safecall;
            end;
            </pre>
            Hinter den Kulissen "sieht" COM jedoch diese Fassung, ohne das der Entwickler diesen Aufbau zu Gesicht bekommt:
            <pre>
            function NeueMethode(InputParam: Integer; out OutputParam: WideString):HRESULT
            </pre>
            Die SafeCall-Deklaration sorgt nur dafür, das eine Exception automatisch niemals den Interface-Bereich verlassen kann (was laut COM auch untersagt ist).

            &#10

            Comment

            Working...
            X