【问题标题】:Apache 2.2.21 module error in Delphi 7 (cannot load specific module into server)Delphi 7 中的 Apache 2.2.21 模块错误(无法将特定模块加载到服务器中)
【发布时间】:2015-05-02 05:48:44
【问题描述】:

我在 Delphi 7 中创建了一个 Apache 2.2.21 模块 (DSO) 并更改了 httpd.conf 文件,但是当我重新启动我的 Apache 时,它​​会引发“无法加载到服务器。找不到指定的模块”错误。我仔细检查了我的模块(.so 文件)是否在 apache 模块文件夹中。这是我的电脑的详细信息:

  1. 操作系统:Windows 7 64 位
  2. Apache:2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/0.9.8r
  3. 德尔福 7 32 位

我还根据 leonardo 的博客为 Delphi 7 的 Apache 2.2.x 版本兼容性更改转换了我的 httpd2.pas 副本,但仍然遇到同样的问题。

这里是代码和配置文件:

  1. httpd2.pas

完整的文件可以在这里找到 (https://github.com/stijnsanders/xxm/blob/master/Delphi/apache/HTTPD2.pas)

  1. 我的模块的 httpd.conf 条目

LoadModule myapachews_module modules/mod_myapachews.so
<Location /rktest>
    SetHandler mod_myapachews-handler
</Location>
  1. myapache_ws.dpr

library myapachews;

uses
  WebBroker,
  ApacheTwoApp,
  mMain in 'mMain.pas' {WebModule1: TWebModule};

{$R *.res}

{$E so}
{$LIBPREFIX 'mod_'}

exports
  apache_module name 'myapachews_module';

begin
  Application.Initialize;
  Application.CreateForm(TWebModule1, WebModule1);
  Application.Run;
end.
  1. mMain.pas

unit mMain;

interface

uses
  SysUtils, Classes, HTTPApp;

type
  TWebModule1 = class(TWebModule)
    procedure WebModule1WebActionItem1Action(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  WebModule1: TWebModule1;

implementation

{$R *.dfm}

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content := '<H1>Hello World</H1>';
end;

end.
  1. mMain.dfm

object WebModule1: TWebModule1
  OldCreateOrder = False
  Actions = <
    item
      Name = 'WebActionItem1'
      OnAction = WebModule1WebActionItem1Action
    end>
  Left = 343
  Top = 116
  Height = 292
  Width = 374
end

任何帮助或信息将不胜感激。

提前致谢, 拉文德

【问题讨论】:

    标签: apache delphi


    【解决方案1】:

    虽然我很荣幸有一个指向我的存储库的链接最终出现在此处,但我也很遗憾您没有查看 xxm 项目,因为它正是您想要实现的目的.它还有一个 Apache HTTPD 处理程序来为您加载 xxm 项目(并让它们通过 IIS、InternetExplorer 的 IInternetProtocol 或本地 xxmHttp 进行调试)。

    回答你的问题。在 Windows 上,您可以继续使用 .dll 文件扩展名,无需将其更改为 .so,这将是不正确的,因为 Delphi 7 编译器不提供 ELF 二进制文件。请记住使用正斜杠或双反斜杠,因为这些用作转义字符。

    还要检查文件是否正确写入 Apache HTTPD 的 modules 目录。或者,您可以在带有 LoadModule 指令的 httpd.conf 中使用绝对路径。

    【讨论】:

    • 我很抱歉无法通过 XXM 项目,因为我只是通过 Leonardo 博客中提到的步骤来修复 Apache 2.2.x 兼容性问题。我认为它应该解决了这个问题,但它没有。好吧,根据您的建议,我尝试在 httpd.conf 文件中使用 .DLL 和绝对路径,但仍然遇到同样的问题。有什么方法可以调试 Apache 或跟踪内部错误,因为我在 Logs*.log 文件中没有看到任何错误?你能注册这个 .dll/.so 文件吗?
    • 我没有调试过 Apache httpd 本身,但是您可以将其设置为主机应用程序。使用-X 命令行参数强制它使用单个httpd.exe 进程。 github.com/stijnsanders/xxm/blob/master/Delphi/apache/…
    • 在 DSO 中调试并进行一些更改后,现在我收到以下错误:“httpd: Syntax error on line 492 of C:/Program Files (x86)/Apache Software Foundation/Apache2 .2/conf/httpd.conf:文件 C:/Program Files (x86)/Apache Software Foundation/Apache2.2/modules/mod_myapach ews.so 中的 API 模块结构“myapachews_module”是乱码 - 预期签名 41503232 但看到 41503230 -也许这不是 Apache 模块 DSO,或者是为不同的 Apache 版本编译的?”。我验证了我的 httpd.pas 已将 MODULE_MAGIC_COOKIE 设置为 $41503232。有什么想法吗?
    • 我想通了——不知何故,我的 Delphi 编译器没有分配这些新的魔法常量——它使用的是旧文件(不知道为什么——即使我完全删除了旧文件)。我要感谢@Stijn 的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 2017-02-05
    • 2012-07-09
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多