Webanwendungen - WebBroker/ WebSnap und der Apache



  • kannst du mir mal so eine test.dll zuschicken ?

    ich probier es dann damit. Wenns funzt liegs zumindest nicht am Apache. (was ich eigentlich noch hoffe).

    Noch mal zusammengefasst, die dll sieht bei mir so aus:

    //---------------------------------------------------------------------------
    #include <WebBroker.hpp>
    #include <ApacheApp.hpp>
    #pragma hdrstop
    
    USEFORM("Unit1.cpp", WebModule1); /* TWebModule: File Type */
    //---------------------------------------------------------------------------
    #define Application Webbroker::Application
    
    #pragma link "ApacheApp.obj"
    #pragma link "webbroker.obj"
    #pragma link "ReqMulti.obj"
    #pragma link "WebSnap.lib"
    #pragma link "WebDSnap.lib"
    
    //---------------------------------------------------------------------------
    extern "C"
    {
      /* Dieses Modul ist der exportierte Einsprungspunkt, auf den von Apache zugegriffen wird.
         Verwenden Sie den Namen dieser Variable in der Datei httpd.conf beim Laden
         dieses Moduls, stellen Sie aber einen Unterstrich voran:
    
         #### Vorschlag für httpd.conf Start
         LoadModule _Project1_module "C:\FullPathToTheDll.dll"
         <Location /some_location>
           SetHandler Project1-handler
         </Location>
        #### Vorschlag für httpd.conf Ende
    
        Stellen Sie sicher, daß die Direktive LoadModule nach der Direktive ClearModuleList
        in httpd.conf kommt.
    
        Um den Namen der Standardberhandlung zu ändern, machen Sie ein strcpy in der DllEntryPoint-
        Funktion unten, z.B.:
    
        ...
    
          if (reason == DLL_PROCESS_ATTACH) {
            strcpy(ContentType, "custom_handler_name-handler");
        ...
    
        */
      // Httpd::module  AP_MODULE_DECLARE_DATA ApacheTest_module;  // zum testen (funzt natürlich nicht)
     Httpd::module __declspec(dllexport) ApacheTest_module;  // hier scheitert der Apache anscheinend *grübel*
    }
    //---------------------------------------------------------------------------
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
    {
      try
      {
        if (reason == DLL_PROCESS_ATTACH) {
          Apacheapp::set_module(&ApacheTest_module);
    		  Application->Initialize();
    		  Application->CreateForm(__classid(TWebModule1), &WebModule1);
           Application->Run();
        }
      }
      catch (Exception &exception)
      {
      }
      return 1;
    }
    //---------------------------------------------------------------------------
    #undef Application
    //---------------------------------------------------------------------------
    

    der Eintrag in der config sieht so aus:

    LoadModule _ApacheTest_module modules/mod_ApacheTest.so
    

    oder halt so:

    LoadModule ApacheTest_module modules/mod_ApacheTest.so
    

    wobei die datei natürlich im Verzeichnis modules liegt.

    ich kann den Fehler echt nicht finden 😞
    Ich mein, dass sich Borland bei der Generierung der Dateien schon was gedacht haben wird... aber..



  • Hi,

    *freu*

    hab die Lösung gefunden. War halt eine Kombination aus Problemen.

    Für diejenigen, die sich demächst mit WebSnap oder WebBroker beschäftigen wollen:

    1. Der BCB funzt nicht mit Apache 2.XXX
    Ich hab bereits in den entsprechenden Newsgroups nach Bugsfixes gefragt und ware noch auf Antworten.
    Installiert eine ältere Apache- Version und dann gehts.

    2. Projektname Modulname und Handlername -> nur lowercase !
    Angebleich haben einige Apache- Versionen Probleme mit Großbuchstaben.

    3. Auf den eigentlichen Webserver die Bibliotheken regristrieren

    Wenn auf dem Rechner, wo der Webserver läuft kein BCB installiert ist, müssen die Typbibliotheken regristiert werden.

    Im Borland/bin- Verzeichnis gibt es eine Datei mit den Namen:
    TregSvr.exe

    diese benutzt ihr auf den Zielrechner um die folgenden Libaries zu regristrieren:

    1. stdvcl40.dll
    2. WebBrokerScript.tlb

    Des weiteren müssen alle verwendeten Libaries wie Medial.dll ADO usw. im Systemverzeichnis des Servers kopiert werden.

    Ansosnten funzt es wie oben beschrieben....



  • Nachtrag:

    in älteren Apache- Versionen gibt es eine Datei mit den Namen access.conf

    diese sollte dann etwa so aussehen:

    # This is the default file for the AccessConfig directive in httpd.conf.
    # It is processed after httpd.conf and srm.conf.

    # To avoid confusion, it is recommended that you put all of your
    # Apache server directives into the httpd.conf file and leave this
    # one essentially empty.

    <Location /URL>
    SetHandler ApacheTest-handler
    </Location>

    wobei URL der Wunschpfad zur Wepapplication ist.
    Hier ist der Pfasd im IE_ Expolrer also:

    http://127.0.0.1/URL

    des wieteren habe ich die Bezeichnung in der Dll festgelegt. Ich weiss jetzt nicht ob dieses Optional ist oder nicht:

    //---------------------------------------------------------------------------
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
    {
      try
      {
        if (reason == DLL_PROCESS_ATTACH) {
        strcpy(ModuleName, "ApacheTest_module");  // Modulname explizit festlegen // eventuell Optional
        strcpy(ContentType, "ApacheTest-handler"); // Handlername explizit festlegen // eventuell Optional
          Apacheapp::set_module(&ApacheTest_module);
    		  Application->Initialize();
    		  Application->CreateForm(__classid(TWebModule1), &WebModule1);
           Application->Run();
        }
      }
      catch (Exception &exception)
      {
      }
      return 1;
    }
    


  • möchte dem noch jemand was hinzufügen ?

    ansonsten:
    FAQ++;



  • im grunde passt folgendes nun nicht mehr zu borland forum, aber vielleicht trägt es noch zum verständnis bei für leute, die- wie ich- zum ersten mal ein modul für den apachen selber schreiben wollen (ein hello world kann auch schön sein 😉 )

    folgende schritte bin ich gegangen...

    ich arbeite mit dem visual studio, was aber hier mal nebensächlich ist.
    wichtig ist: unter windows, und ich erstelle eine dll.

    ausgangsdatei:

    #include "httpd.h"
    #include "http_config.h"
    #include "http_core.h"
    #include "http_log.h"
    #include "http_main.h"
    #include "http_protocol.h"
    #include "util_script.h"
    #include "ap_config.h"
    
    #include <stdio.h>
    
    static int hello_handler(request_rec *r)
    {
      r->content_type = "text/html";
    
      ap_send_http_header(r);
      ap_rputs("Hello ",r);
      ap_rputs("World!",r);
      return OK;
    }
    /* list of content handlers */
    static const handler_rec hello_handlers[] = { 
        { "hello", hello_handler }, 
        { NULL, NULL }
    };
    
    /*  list for API hooks */
    module MODULE_VAR_EXPORT hello_module = {
        STANDARD_MODULE_STUFF, 
        NULL,                  /* module initializer                  */
        NULL,                  /* create per-dir    config structures */
        NULL,                  /* merge  per-dir    config structures */
        NULL,                  /* create per-server config structures */
        NULL,                  /* merge  per-server config structures */
        NULL,                  /* table of config file commands       */
        hello_handlers,       /* [#8] MIME-typed-dispatched handlers */
        NULL,                  /* [#1] URI to filename translation    */
        NULL,                  /* [#4] validate user id from request  */
        NULL,                  /* [#5] check if the user is ok _here_ */
        NULL,                  /* [#3] check access by host address   */
        NULL,                  /* [#6] determine MIME type            */
        NULL,                  /* [#7] pre-run fixups                 */
        NULL,                  /* [#9] log a transaction              */
        NULL,                  /* [#2] header parser                  */
        NULL,                  /* child_init                          */
        NULL,                  /* child_exit                          */
        NULL                   /* [#0] post read-request              */
    };
    

    bitte in c datei abspeichern, nicht in c++.
    der MODULE_VAR_EXPORT muss in dieser form beschrieben werden, der einfachheit halber alles auf NULL.
    der obige aufbau ist zwingend für eine modul dll des apachen.
    beim späteren loaden sucht er nach der passenden apache-api struktur. stimmt hier etwas nicht, startet euer server nach der konfiguration nicht mehr.

    zur erstellen der dll braucht ihr die nötigen header. ich habe eine apache version, bei der ich mir den src code gleich mitgeholt habe. der apache kann als binary mit scr downgeloadet werden, das wird hier gebraucht. übrigens ist dort auch ein example modul dabei, wobei dies ein wenig extrem unübersichtlich ist. deswegen hier erstmal ein einfaches "hello world".
    nachdem ihr eine dll erstellt habt (die include pfade müssen auf den apache src angepasst werden, und der linker muss die ApacheCore.lib mitlinken), wird die dll wie sie ist in den module ordner geworfen.

    ich nenne sie um in: mod_hello.dll

    nun wird die konfiguration angepasst: ich öffne die http.conf und ändere folgende zeilen:

    #LoadModule anon_auth_module modules/mod_auth_anon.so
    #LoadModule dbm_auth_module modules/mod_auth_dbm.so
    #LoadModule digest_auth_module modules/mod_auth_digest.so
    #LoadModule cern_meta_module modules/mod_cern_meta.so
    #LoadModule digest_module modules/mod_digest.so
    #LoadModule expires_module modules/mod_expires.so
    #LoadModule headers_module modules/mod_headers.so
    #LoadModule proxy_module modules/mod_proxy.so
    #LoadModule rewrite_module modules/mod_rewrite.so
    #LoadModule speling_module modules/mod_speling.so
    #LoadModule info_module modules/mod_info.so
    #LoadModule status_module modules/mod_status.so
    #LoadModule usertrack_module modules/mod_usertrack.so
    LoadModule hello_module modules/mod_hello.dll
    
    ......................
    .................
    #
    # Allow remote server configuration reports, with the URL of
    # http://servername/server-info (requires that mod_info.c be loaded).
    # Change the "localhost" to match your domain to enable.
    #
    #<Location /server-info>
    #    SetHandler server-info
    #    Order deny,allow
    #    Deny from all
    #    Allow from localhost
    #</Location>
    
    <Location /hello_demo>
            SetHandler hello
        </Location>
    

    die stellen suchen, möglichst richtig einfügen.

    nun apache neu starten und einen ordner anlegen: hello demo.

    folgende aufruf bringt zum bleistift das hello world

    http://127.0.0.1/hello_demo/dumdidum

    viel spaß beim weiter ausbauen...



  • Hi elise,

    super Beitrag 👍 Eine Bereicherung für die FAQ 😉

    im grunde passt folgendes nun nicht mehr zu borland forum,

    nene, passt ganz gut. Bloß weil Borländer VCL gewohnt sind bedeutet das noch nicht, dass sie nicht mit mit anderen Header umgehen können 🙂

    Ich hab da aber noch ein paar Schwierigkeiten. Das Beispiel aus dem Link (ganz oben), bzw. ein etwas anderes funktioniert nun. Zur Erinnerung: Diese sind mit WebBroker erstellt worden.

    Meine WebSnap- Anwendung wird nun ebenfalls richtig geladen. Das erkenne ich daran, dass erstens der Apache gestartet ist 🙂 und ich die dll nach dem Start vom Indianer nicht löschen kann. Die dll ist also geöffnet. Leider bekomme ich bei dieser WebSnap- Anwendung nicht an die Seiten dran. Ich bekomme stets "404- File not found" 😞

    Komischerweise gehts mit WebBroker. Weiß der Geier warum...

    Man, die Scheisse zerrt doch ganz schön an meinen Nerven. 😞



  • so, Problem erkannt, Problem verbannt. 🙂

    Ich Idiot hab vergessen die *.html- Seiten mit in das modules/ - Verzeichnis zu kopieren. Man kann übrigens auch ein anderes Verzeichnis wählen, um eine Trennung der Dateien von den anderen Modulen zu erreichen.

    Ach ja, vergeßt den "_" nicht !

    Noch einmal eine kleine Zusammenfassung meiner mühen:

    1. Eine Webanwendung über Datei/Neu/WebSnap/WebSnap-Anwendung erstellen und die Option Webdebugger wählen.
    Das Projekt aufbauen und debuggen. Wenn alles in Ordnung Schritt2.

    2. Ein neues Projekt über Datei/Neu/WebSnap/WebSnap-Anwendung erstellen und diesesmal "Apache Shared Modul dll" wählen.
    Alle ! Dateien aus den neu entfernten Projekt entfernen und alle Dateien aus dem Debug- Projekt diesem Projekt hinzufügen. Außer die Project- cpp der Debuganwendung und das Formular ( ist nur zum Testen da und das wollen wir ja nicht mehr).

    Projekt- cpp so anpassen:

    USEFORM("Unit1.cpp", WebModule1); /* TWebModule: File Type */ 
    //--------------------------------------------------------------------------- 
    #define Application Webbroker::Application 
    
    #pragma link "ApacheApp.obj" 
    #pragma link "webbroker.obj" 
    #pragma link "ReqMulti.obj" 
    #pragma link "WebSnap.lib" 
    #pragma link "WebDSnap.lib" 
    
    //--------------------------------------------------------------------------- 
    extern "C" 
    { 
     Httpd::module __declspec(dllexport) ApacheTest_module;  // dieses ist der Modulname, welche in der Apache httpd.conf angegeben werden muß.
                                        // dieser Name sollte mit dem Projektnamen identisch sein, wobei "_module" hinten dran gehängt wird
    } 
    //--------------------------------------------------------------------------- 
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) 
    { 
      try 
      { 
        if (reason == DLL_PROCESS_ATTACH) { 
         strcpy(ContentType, "einhandler-handler"); // Handlername explizit festlegen // unbedingt Lowercase !-> Keine Großbuchstaben !!!
       Apacheapp::set_module(&ApacheTest_module); 
              Application->Initialize(); 
              Application->CreateForm(__classid(TWebModule1), &WebModule1); 
           Application->Run(); 
        } 
      } 
      catch (Exception &exception) 
      { 
      } 
      return 1; 
    } 
    //--------------------------------------------------------------------------- 
    #undef Application
    

    Dann Project speichern und erstellen. Die erzeugte Dll und alle Html- Seiten in das modules/- Verzeichnis des Indianers kopieren.

    3. httpd.conf und access.conf öffnen.

    in der httpd.conf muss das Modul geladen werden.
    Per Definition geht das so:

    LoadModule Modulname Pfand_und_dateiname_der_dll

    also so:

    //--------------------------------------------------
    ## Modul laden
    ## achtet darauf, das ein zusätzliches "_" vor dem Modulnamen eingefügt wird. 
    ## wenn also das Modul in der Projektcpp "ApacheTest_module" heißt schreibt "_ApacheTest_module" !!
    
    LoadModule _ApacheTest_module modules/ApacheTest.dll
    ## End Modul laden
    //--------------------------------------------------
    

    in der access.conf muss dem Indianer erklärt werden, unter welcher URL diese Anwendung im Netz verfügbar gemacht werden soll.
    Per Definition:

    <Location /WUNSCHURL>
    SetHandler Handlername_aus_der_Projektcpp // siehe strcpy(ContentType, "einhandler-handler");
    </Location>

    //--------------------------------------------------
    <Location /test>
      SetHandler einhandler-handler 
    </Location>
    //--------------------------------------------------
    

    So, nun den Apache neu starten und die URL eingeben:

    127.0.0.1/test

    viel Spaß beim Ausprobieren. Hat mir viele Nerven gekostet 😉



  • so, nun noch ein kleiner Nachtrag. Diese Vorgehensweise setzt voraus, dass auf dem Rechner eine Apache- Version so um die 1.3 installiert ist. Eine Apache- Version ab 2.0 ist so nicht mit den BCB und Webanwendungen lauffähig.

    Es gibt aber ein paar schlaue köpfe, die nichts bessere zu tun haben als sich mit so'n Scheiss zu beschäftigen. Einer von denen hat dazu eine tolle Seite: Dr.Bob's Delphi Clinic 😃

    Der Mann ist echt Klasse 🙂

    Er beschriebt, wie man sich den Quellcode anpasst, damit BCB oder Delphi mit Apache 2.xx funzt. Sehr interessant.

    wer jetzt noch was hinzufügen möchte, kann diese noch gern tun, bevor dieses in die FAQ kommt...



  • Wenn du wirklich den kompletten Thread in die FAQ stellen willst solltest du evtl. im ersten Beitrag einen Hinweis auf die letzendliche Lösung unterbringen, damit man sich ggf. nicht erst durch die ganzen Irrungen und Wirrungen arbeiten muss. 😉
    Wer sich für die Details der Lösungsfindung interessiert kann/wird das ja trotzdem machen.



  • done 😃

    So ab in die FAQ damit. Da ist wohl ne neuer Abschnitt im FAQ- Index fällig -> "Webanwendungen" 🙂


Anmelden zum Antworten