Thema: Delphi ISAPI DLL und OOP?

Einzelnen Beitrag anzeigen

Nuclear-Ping
(Gast)

n/a Beiträge
 
#1

ISAPI DLL und OOP?

  Alt 19. Jun 2004, 21:32
Hallo,

einem Tutorial für ISAPI WebServer Module (von Assarbad) folgend habe ich eine ISAPI DLL zusammengeschustert und meinem Apache klar gemacht, dass er mit dieser arbeiten soll. Nach einigen erfolgreichen Testläufen hab ich diese nach OOP umgestellt, jedoch scheiterts jetzt irgendwie ein wenig:

Code:
    ...

      // *****************************
      TQueryRequestFullfillerClass = class
      // *****************************
        constructor Create (var pECB: TEXTENSION_CONTROL_BLOCK);
      private
        Response:   Array[0..MAX_PATH] of Char;
        AllParams:  TParamStrings;
        dwLen:      Cardinal;

        Page,
        QueryString: WideString;

        ...
      public
        function SendResponse (var pECB: TEXTENSION_CONTROL_BLOCK): Integer;
      end;

      // *****************************
      THoroscopeRequestFullfillerClass = class (TQueryRequestFullfillerClass)
      // *****************************
      private
        ...
      public
        function ProcessRequest (var pECB: TEXTENSION_CONTROL_BLOCK): Integer;
      end;

    ...

    // *****************************
    constructor TQueryRequestFullfillerClass.Create (var pECB: TEXTENSION_CONTROL_BLOCK);
    // *****************************
    begin
      if (lstrcmpi (pECB.lpszMethod, 'POST') = 0) then
        begin
          SetString (QueryString, PChar(pECB.lpbData), pECB.cbTotalBytes);
          AllParams := GetAllParams (QueryString);
        end;

      if (lstrcmpi (pECB.lpszMethod, 'GET') = 0) then
        begin
          SetString (QueryString, PChar (pECB.lpszQueryString), Length (pECB.lpszQueryString));
          AllParams := GetAllParams (QueryString);
        end;

      Page := '';
    end;

    // *****************************
    function TQueryRequestFullfillerClass.SendResponse (var pECB: TEXTENSION_CONTROL_BLOCK): Integer;
    // *****************************
    begin
      Page := 'Content-Type: text/html' + #13#10#13#10 + Page;
      dwLen := lStrLen (@Page[1]);
      lstrcpy (Response, '200 OK');
      if pECB.ServerSupportFunction (pECB.ConnID, HSE_REQ_SEND_RESPONSE_HEADER, @Response, @dwLen, @page[1]) then
        Result := HSE_STATUS_SUCCESS
      else
        Result := HSE_STATUS_ERROR;
    end;

    // *****************************
    function THoroscopeRequestFullfillerClass.ProcessRequest (var pECB: TEXTENSION_CONTROL_BLOCK): Integer;
    // *****************************
    begin
      Page := '
[b]Hello World![/b]
';
      Result := SendResponse (pECB);
    end;
Das ist erst einmal der "Header" ...

Über die HttpExtensionProc erzeuge ich nun eine Instanz der Klasse THoroscopeRequestFullfillerClass, rufe die Funktion ProcessRequest auf und übergebe dabei den pECB-Parameter, der da wiederum weiterverarbeitet wird:

Code:
    // *****************************
    function HttpExtensionProc (var pECB: TEXTENSION_CONTROL_BLOCK): DWORD; stdcall;
    // *****************************
    var
      QueryRequest: THoroscopeRequestFullfillerClass;
      Response: PChar;
      Page: String;
      dwLen: Integer;
    begin

      QueryRequest := THoroscopeRequestFullfillerClass.Create (pECB);
      Result := QueryRequest.ProcessRequest (pECB);
      QueryRequest.Free;

    end;
Was nun allerdings passiert ist, dass der Browser mir die DLL zum Download anbietet ... !? o_O

Allerdings gibts keine Probleme, wenn ich die Ausgabe nicht über das Objekt laufen lasse:

Code:
    // *****************************
    function HttpExtensionProc (var pECB: TEXTENSION_CONTROL_BLOCK): DWORD; stdcall;
    // *****************************
    var
      QueryRequest: THoroscopeRequestFullfillerClass;
      Response: PChar;
      Page: String;
      dwLen: Integer;
    begin

      Page := 'Hello World!';

      Page := 'Content-Type: text/html' + #13#10#13#10 + Page;
      dwLen := lStrLen (@Page[1]);
      lstrcpy (Response, '200 OK');
      if pECB.ServerSupportFunction (pECB.ConnID, HSE_REQ_SEND_RESPONSE_HEADER, @Response, @dwLen, @page[1]) then
        Result := HSE_STATUS_SUCCESS
      else
        Result := HSE_STATUS_ERROR;

    end;
Jemand eine Idee, warum das nicht wie gedacht funktioniert?

(System: WinXP Prof, Apache 1.3.1, Delphi 6 DE Prof)

Grüße,
Mario
  Mit Zitat antworten Zitat