Webanwendungen - WebBroker/ WebSnap und der Apache
-
Hi,
ich versuche schon ne Zeit lang eine Webanwendung, welche über WebBroker oder WebSnap erstellt wurde, an den Apache zu binden.
Leider ohne Erfolg.
Ich bekomme stets die Fehlermeldung von Apache:Can not load "blab/blab/Datei.dll" into server: Angegebenes Modul wurde nicht gefunden.
dabei habe ich mich an diese Beschreibung gehalten
Ich verwende:- BCB6 Enterprise
- Apache 2.0.47wer weiß Rat ?
[EDIT]
Die Lösung und eine Vorgehensbeschreibung für eine WebSnap- Anwendung findet ihr am Ende dieses Threads. Damit ihr aber versteht, was für Probleme solch eine Anwendung verursachen kann, habe ich den ganzen Weg zur Lösungsfindung im Thread stehen lassen.Ebenfalls findet man am Ende ein Link, wo das Anpassen eines Apache 2.xx beschrieben wird.
AndreasW
[/EDIT]
-
richtig rat sicher nicht... aber ich habe mal was ähnliches gemacht mit lisp
http://www.fractalconcept.com/asp/JC3/sdataQv7hO19fCGcmDM==/sdataQu8h-N3qe0jUC1B=bei mir läuft die mod_lisp.dll mit dem apache zusammen..
ich habe sie übrigens einfach mit in den modules ordner gepackt und in der config folgende zeile zugefügt:
LoadModule lisp_module modules/mod_lisp.dll
ich erinnere mich, daß sie am anfang nicht so richtig wollte.. ähnliche fehlermeldung wie bei dir.
das umbenennen nach so war nicht wichtig bei mir, lief so.. aber ist auch anders gestrickt.
so läuft die kommunikation mit mod_lisp: http://lisp.t2100cdt.kippona.net/lispy/home
na ja.. hilft dir jetzt nix, aber vielleicht bringt die seite dich auf den richtigen pfad... wo hast du die .so hingelegt die du aus der dll erstellt hast?
-
Hi elise,
dank erst mal für die Links.elise schrieb:
na ja.. hilft dir jetzt nix, aber vielleicht bringt die seite dich auf den richtigen pfad... wo hast du die .so hingelegt die du aus der dll erstellt hast?
ich hab die dll auch in das /modules- Verzeichnis gelegt und folgende Zeile in der Konfig- Datei hinzugefügt (die Datei heist im konkreten Fall zum Beispiel: "_Kundenexpost.dll") :
LoadModule _Kundenexpost_module modules/_Kundenexpost.dll
nach der Beschreibung in der dll- CPP:
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 EndeStellen 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 __declspec(dllexport) ApacheTest_module;
}habe ich es natürlich auch mit "_" versucht:
LoadModule __Kundenexpost_module modules/_Kundenexpost.dll
auch hab ich das Beispiel aus dem Link nachgeschrieben und so eingebunden:
LoadModule ApacheTest_module modules/mod_ApacheTest.so
wobei ich die dll nach .so umbenannt und "mod_" davorgeschrieben habe.
auch eine Anweisung nach der C++- Anweisung:
LoadModule _ApacheTest_module modules/mod_ApacheTest.so
brachte genauso wenig Erfolg wie das Verwenden von Vollständigen Pfaden.
Die Dateien scheint der Indianer ja zu finden, da er sie ja auch auf macht. Er kann das Modul in der Datei aber darin nicht finden.Kann es sein, dass es mit bestimmten Versionen des Apache funktioniert ?
Gibt es Alternativen um das Modul einzubinden ?
-
das mit dem umbenennen ist beim windows apachen meines wissens nicht nötig (na ja.. lisp läuft auch ohne umbenennen)
ich habe einfach das loadmodule wie oben beschrieben an die stelle der anderen module hinzugefügt
LoadModule lisp_module modules/mod_lisp.dll
die dll mit in den ordner modules des apachen geschmissen (wollte die umständliche pfaderei verhindern) und dann noch dieses hinzugefügt
<Location /asp> SetHandler lisp-handler </Location>
muss auch an der richtigen stelle stehen, da wo die anderen händler sind:
bei mir stehts unter
# 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>
aufrufen tue ich lisp nun im entsprechenden ordner asp, sonst geht es nicht, er hat nur dafür die berechtigung...
und der lisp server muss horchen, weil die bei mir ja kommunizieren...übrigens alles ohne die unterstriche..
hmm ich denke auch mal darüber nach, eine testdll zu machen... wenn ich zeit habe, selber habe ich leider noch keine kreiert..
sorry, mehr weiß ich auch nicht, aber es sieht eigentlich nur nach einem pfadproblem aus.du arbeitest unter windows? also immer den apachen neu starten zu jedem versuch.
-
noch ein link
http://httpd.apache.org/docs/mod/mod_so.html
hier reden sie noch vom libexec ordner im apachen.. und zusätzlich nutzen sie dlls, nicht so.. mal anschaun ...
-
und ein dritter:
den ersten fall habe ich schon praktiziert, aber mit ner dll beschreiben sie es hier so:
The Apache module API is unchanged between the Unix and Windows versions. Many modules will run on Windows with no or little change from Unix, although others rely on aspects of the Unix architecture which are not present in Windows, and will not work.
When a module does work, it can be added to the server in one of two ways. As with Unix, it can be compiled into the server. Because Apache for Windows does not have the Configure program of Apache for Unix, the module's source file must be added to the ApacheCore project file, and its symbols must be added to the os\win32\modules.c file.
The second way is to compile the module as a DLL, a shared library that can be loaded into the server at runtime, using the LoadModule directive. These module DLLs can be distributed and run on any Apache for Windows installation, without recompilation of the server.
To create a module DLL, a small change is necessary to the module's source file: The module record must be exported from the DLL (which will be created later; see below). To do this, add the AP_MODULE_DECLARE_DATA (defined in the Apache header files) to your module's module record definition. For example, if your module has:
module foo_module;
Replace the above with:
module AP_MODULE_DECLARE_DATA foo_module;
http://httpd.apache.org/docs-2.0/mod/mod_so.html
na ja, obs hilft... aber testen tu ich es ... heute abend
-
hm, hast du Windows bei dir drauf oder Linux/Unix ?
-
To create a module DLL, a small change is necessary to the module's source file: The module record must be exported from the DLL (which will be created later; see below). To do this, add the AP_MODULE_DECLARE_DATA (defined in the Apache header files) to your module's module record definition. For example, if your module has:
module foo_module;
Replace the above with:
module AP_MODULE_DECLARE_DATA foo_module;
ok. Nun ein Zitat aus einer andern html von Apache. Wahrscheinlich die selbe Position nur andere Version.
To create a module DLL, a small change is necessary to the module's source file: The module record must be exported from the DLL (which will be created later; see below). To do this, add the MODULE_VAR_EXPORT (defined in the Apache header files) to your module's module record definition. For example, if your module has:
module foo_module;
Replace the above with:module MODULE_VAR_EXPORT foo_module;
*kopfschüttel*
Deine Version ist 2.0 und meine 1.3.
ich bezweifel dass eine derartige Umstrukturierung der von der IDE erzeugten DLL zu erfogen führt. Zumal weder AP_MODULE_DECLARE_DATA noch MODULE_VAR_EXPORT in den eingebundenen Headern zu finden ist.
Da hier die Definition abweicht glaube ich, dass der BCB nur mit 2.0 zurecht kommt. Die 1.3 und 1.4 mag er ja gar nicht. Ich werd also nun die dritte Apache- Version (2.0) installieren...
ich werd das jetzt mal prüfen
*stöhn*
*verzweifel*
*urlaubbrauchend_auf_absenden_klickend*
-
ohm man ich bin echt urlaubsreif...
ich seh gerade, ich hab ja Apache 2.0.47 drauf. Daran kanns also auch nicht liegen.
habs nun auch mal mit einer 2.0.45- Version versucht... ohne Erfolg
-
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.exediese benutzt ihr auf den Zielrechner um die folgenden Libaries zu regristrieren:
1. stdvcl40.dll
2. WebBrokerScript.tlbDes 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: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"