Announcement

Collapse
No announcement yet.

Hilfe!

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

  • Hilfe!

    Hallo zusammen<br>
    Ich habe folgendes getan (ich benutze Delphi 5 Professional):<br>
    Neu->ActiveX->ActiveX-Bibliothek<br>
    Neu->ActiveX->Active-Server-Object<br>
    Name der CoClass: myASPObj<br>
    Instantiierung: Mehrere Instanzen<br>
    Threading-Modell: Apartment<br>
    Active-Server-Typ: Objektkontext<br>
    Für dieses Objekt ein Vorlagen-Test-Script generieren: Ja<br><br>

    Im Typeditor IMyASPObj eine Methode hinzugefügt (myWrite), Methode ohne Paramater, ohne Rückgabewert. Dann "Implementierung aktualisieren gedrückt und in Unit1 folgenden Code hinzugefügt/ergänzt:
    <pre>
    procedure TMyASPObj.myWrite;
    begin
    response.Write('Ein Testaufruf');
    end;
    </pre><br>
    Dann habe ich das von Delphi vorgenerierte asp-Skript MyASPObj.asp aktualiesiert:<br>
    <pre>
    &lt;HTML&gt;
    &lt;BODY&gt;
    &lt;TITLE&gt; Test von Delphi ASP &lt;/TITLE&gt;
    &lt;CENTER&gt;
    &lt;H3&gt; Sie sollten das Ergebnis Ihrer Delphi Active Server-Methode unten sehen&lt;/H3&gt;
    &lt;/CENTER&gt;
    &lt;HR&gt;
    &lt;% Set DelphiASPObj = Server.CreateObject("ASPTest.MyASPObj")
    DelphiASPObj.myWrite
    %&gt;
    &lt;HR&gt;
    &lt;/BODY&gt;
    &lt;/HTML&gt;</pre><br><br>

    Dann habe ich alles gespeichert - das asp-Skript unter C:\Inetpub\wwwroot\myASPObj.asp; Unit1 unter c:\Inetpub\scripts\test.pas; Project2 unter c:\Intepub\scripts\ASPTest.dpr.<br><br>

    Dann habe ich das ganze kompiliert (Strg+F9) und den ActiveX-Server erfolgreich eingetragen (Start->ActiveX-Server eintragen).<br>
    Als nächstes habe ich dann den Internet Explorer gestartet und als URL myASPObj.asp eingegeben. Resultat: schwerwiegender Fehler /myASPObj.asp, line 9 (das ist der Aufruf von myWrite). Häufig habe ich auch die Meldung "Das Objekt unterstützt die Methode nicht"...<br>
    Was mache ich da falsch?<br>
    Auf meinem XP-Rechner läuft als Webserver übrigens der IIS V5.1<br>
    Danke im voraus<br>
    Patrick

  • #2
    Hallo,

    ich habe das Beispiel mit Delphi 5 (UpdatePack1) unter Windows XP nachgebaut:
    <pre>
    unit OSD5ASP_Impl;

    interface

    uses
    ComObj, ActiveX, AspTlb, OSD5ASP_TLB, StdVcl;

    type
    TOSD5ASPObj = class(TASPMTSObject, IOSD5ASPObj)
    protected
    procedure DoWork(const sTxt: WideString); safecall;
    end;

    implementation

    uses ComServ;

    procedure TOSD5ASPObj.DoWork(const sTxt: WideString);
    begin
    Response.Write('Ein Testaufruf');
    end;

    initialization
    TAutoObjectFactory.Create(ComServer, TOSD5ASPObj, Class_OSD5ASPObj,
    ciMultiInstance, tmApartment);
    end.
    </pre>

    Im Fenster der <b>Internet-Informationsdienste</b> habe ich für die Webseite ein neues <b>Virtuelles Verzeichnis</b> mit dem Namen <i>OSASP</i> angelegt, das auf das Festplattenverzeichnis mit der von Delphi generierten ASP-Datei zeigt. Im Eigenschaftsdialog dieses Virtuellen Webverzeichnisses habe ich als <b>Anwendungsschutzt</b> den Eintrag <b>Hoch (isoliert)</b> ausgewählt.

    Die ASP-Datei wurde von mir wie folgt geändert:
    <pre>
    < HTML>
    < BODY>
    < TITLE> Test von Delphi ASP < /TITLE>
    < CENTER>
    < H3> Sie sollten das Ergebnis Ihrer Delphi Active Server-Methode unten sehen< /H3>
    < /CENTER>
    < HR>
    < % Set DelphiASPObj = Server.CreateObject("OSD5ASP.OSD5ASPObj")
    DelphiASPObj.DoWork "Text aus der ASP"
    % >
    < HR>
    < /BODY>
    < /HTML>
    </pre>

    Wenn ich dann im Internet Explorer die URL <i>http://localhost/OSASP/OSD5ASPObj.asp</i> aufrufe, erhalte ich das folgende Ergebnis:

    <pre>
    Sie sollten das Ergebnis Ihrer Delphi Active Server-Methode unten sehen

    --------------------------------------------------------------
    Ein Testaufruf
    --------------------------------------------------------------
    </pre>

    Die ASP-Datei sollte nicht im Wurzelverzeichniss des IIS liegen, sondern immer in einem eigenen virtuellen Webverzeichnis

    Comment


    • #3
      Also irgendwie...<br>
      Ich habe das jetzt genauso gemacht, und bekomme immer noch einen schwerwiegenden Fehler in Zeile 9 :-(<br>
      Das Com-Object wird übrigens erstellt (ich hatte einmal vergessen, den activeX-Server einzutragen, da hatte ich dann einen schwerwiegenden Fehler in Zeile 8), aber der Aufruf der Methode klappt nicht.<br>
      Ich benutze hier auf dem Firmenrechner Delphi 5 und zwar, soweit ich weiß, ohne Servicepack - kann das eventuell daran liegen?.<br&gt

      Comment


      • #4
        Hallo,

        &gt;..kann das eventuell daran liegen?

        dies lässt sich mit einem weiteren Test klären - da ich dort auf die speziellen VCL-Klassen verzichte, kann auch ein Bug nicht stören:
        <pre>
        { ************************************************** **************
        Autor : Andreas Kosch
        Compiler : Delphi 5
        Betriebssystem : Windows 2000
        Begonnen am : 21.05.2000
        Beschreibung : ASP-Objekt mit Delphi 4/5 Professional (d.h.
        ohne die Experten aus der Enterprise-Version)
        Step 1: ActiveX-Bibliothek
        Step 2: Automations-Objekt
        Step 3: Typbibliothek der Microsoft Active
        Server Pages Objekt Library (Version 3.0)
        importieren
        Step 4: Bei Bedarf die Typbibliothek der
        COM+ Services Type Library importieren
        oder nur der Uses-Anweisung hinzufügen
        (falls bereits vorhanden)
        ************************************************** ************** }

        unit AspDelProObj_Impl;

        interface

        uses
        ComObj, ActiveX, AspDelProObj_TLB, StdVcl,
        ASPTypeLibrary_TLB, COMSVCSLib_TLB; // manuell hinzufügen

        type
        TADPObj = class(TAutoObject, IADPObj)
        protected
        procedure DoWork; safecall;
        procedure ShowArgument(vData: OleVariant); safecall;
        procedure ShowServerVariables(vParam: OleVariant; out vResult: OleVariant);
        safecall;
        end;

        implementation

        uses ComServ;

        procedure TADPObj.DoWork;
        var
        aApp : IMTxAS;
        aOC : ObjectContext;
        aResp: IResponse;
        begin
        aApp := CoAppServer.Create;
        aOC := aApp.GetObjectContext;
        aResp := IDispatch(aOC.Get_Item('Response')) as IResponse;
        aResp.Write('< H2> Die Antwort, die aus dem Objekt kam.< /H2>');
        end;

        procedure TADPObj.ShowArgument(vData: OleVariant);
        var
        aApp : IMTxAS;
        aOC : ObjectContext;
        aResp : IResponse;
        begin
        aApp := CoAppServer.Create;
        aOC := aApp.GetObjectContext;
        aResp := IDispatch(aOC.Get_Item('Response')) as IResponse;
        aResp.Write('< H2>Objekt-Methode ShowArgument< /H2>');
        aResp.Write('Als Argument wurde übergeben: ' + vData);
        end;

        procedure TADPObj.ShowServerVariables(vParam: OleVariant;
        out vResult: OleVariant);
        var
        aApp : IMTxAS;
        aOC : ObjectContext;
        aResp : IResponse;
        begin
        aApp := CoAppServer.Create;
        aOC := aApp.GetObjectContext;
        aResp := IDispatch(aOC.Get_Item('Response')) as IResponse;
        aResp.Write('< H2>Objekt-Methode ShowServerVariables< /H2>');
        aResp.Write('Als Argument wurde übergeben: ' + vParam);
        vResult := 'Der Wert aus dem < b>ASP-Objekt< /b> wird zurückgeliefert';
        end;

        initialization
        TAutoObjectFactory.Create(ComServer, TADPObj, Class_ADPObj,
        ciMultiInstance, tmApartment);
        end.
        </pre&gt

        Comment

        Working...
        X