2011-03-25 56 views
1

在Delphi XE中正确使用Apache方法apr_pool_create_ex是什么?在Delphi XE中正确使用Apache方法apr_pool_create_ex是什么?

我已经创建了Apache模块,但都是Handlers。现在我正在开发服务提供商。一个框架模块已经被创建,我的child_init回调方法被Apache调用。在child_init方法中,我成功调用了ap_pool_create_ex *(返回APR_SUCCESS),但是在离开child_it调用之后,我在第三个或第四个工作线程(httpd.exe)产生期间收到访问冲突(第三个事件显示在事件中日志)。

procedure provider_child_init(pchild: Papr_pool_t; s: Pserver_rec); cdecl; 
var 
    rv : apr_status_t; 
    mypool : Papr_pool_t; 
begin 
    rv := -1; 
    rv := apr_pool_create_ex(@mypool,pchild,nil,nil); 
end; 

的AV消息是:

“项目C:\ APACHE2.2 \ BIN \ http.exe 提出太多连续 例外:“访问冲突在 00000000:地址读 0x00000000'。进程已停止。使用步骤 或运行以继续”

事件日志:

… 
Thread Start: Thread ID: 5652. Process httpd.exe (4212) 
Thread Start: Thread ID: 5132. Process httpd.exe (4212) 
Thread Start: Thread ID: 5988. Process httpd.exe (4212) 

注:发生在线程ID的AV 5988和4212是父httpd.exe进程。

  • Windows“libapr-1.dll”不包含“apr_pool_create”,这就是为什么我使用“_ex”版本的原因。任何想法为什么apr_pool_create缺失?我看到apr_pool_create被用于其他成功的modules,尽管它们是用'C'写成的。

OS:Windows 7企业版64位

阿帕奇:2.2.17.0

IDE:德尔福XE

+0

关于apr_pool_create丢失的原因,可能不会从DLL中导出,因为您可以使用它执行任何操作,您也可以使用apr_pool_create_ex等操作。尽管如此,用C编写的模块仍然可以静态链接到它。 – 2011-03-26 00:34:31

回答

2

是您的翻译功能正确吗? Delphi XE Version Insight(颠覆插件)声明,如下所示:

type 
    PAprPool = ^TAprPool; 
    TAprPool = THandle; 
    PAprAllocator = ^TAprAllocator; 
    TAprAllocator = THandle; 
    TAprAbortFunc = function(retcode: Integer): Integer; stdcall; 

var 
    apr_pool_create_ex: function(out newpool: PAprPool; parent: PAprPool; abort_fn: TAprAbortFunc; 
    allocator: PAprAllocator): TAprStatus; stdcall; 

还要检查,如果你的provider_child_init回调应该被宣布为cdecl,而不是stdcall

此外,一些想法,因为你得到一个空指针访问冲突。据年利率源代码comment

  • 如果(在你的情况下),你传递一个零分配器将用于父池的分配。我假设在父池为零的情况下,分配器一定不能为零。
  • abort_fn如果池不能分配内存将被回调。你通过它零;也许池正试图调用它,因为它不能分配内存?
  • 我不认为你可以从不同的线程访问相同的池。您可能必须为每个线程创建一个单独的池。
+0

感谢您的帮助。我使用apr_pool_create_ex的FreePascal定义(未包含在Delphi中)。看来,第一个参数是罪魁祸首。我定义了一个abort_fn,但是它并没有被调用,所以我试图使它工作的一部分,我把它设置为零,看看会发生什么。顺便说一句,provider_child_init func被定义为cdecl。 – TDF 2011-03-26 02:13:42

相关问题