Announcement
Collapse
No announcement yet.
Wie erstelle ich eine Activex-dll für ASP-Komponenten?
Collapse
X
-
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)
-
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>
Comment
-
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
-
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).


Comment
Comment