2011-03-25 54 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

相關問題