2012-04-13 100 views
0

我想爲我的C++ dll創建php 5.2.17擴展。 Iam在Windows XP上使用Visual Studio 2005與Sambar Server 7.0一起使用。 我有兩個問題:環繞C++ dll php5擴展的問題

  1. 我能不能包括在我的代碼C++的東西(字符串或STL地圖)..它給錯誤,如:「PHP遇到一個訪問衝突在00CF421B」。如何在我的dll中使用字符串和STL映射。

  2. 我想創建一個C++ DLL其中包含字符串類型的3個參數的函數,返回的那些3.

下面第二個串是碼:

PHP_FUNCTION(add){ 
    char* a; 
    char* b; 
    char* c; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &a,&b,&c) == FAILURE) { 
     RETURN_STRING("Bad parameters!", true); 
    } 

    //string ss=a; 
    //ss=ss+b; 
    //memset(a,0,30); 
    //strcpy(a,ss.c_str()); 
    //php_printf("a : %s b : %s ",a,b); 
    RETURN_STRING(b,1); 
} 

php文件包含:

$a="abc"; 
$b="def"; 
$c="ghi"; 
$result = add($a,$b,$c); 
print "Calling add($a,$b,$c) returned $result"; 

- >這裏第一個字符串返回罰款時,兩個參數爲此功能設置了專家。

- >當試圖用兩個參數,這個功能,然後我得到一個錯誤返回第二個字符串:「PHP遇到在014AE07C訪問衝突」

- >當3個參數,如上面的代碼嘗試那麼我的水鹿服務器正在關閉..沒有看到輸出的機會。

爲什麼這種奇怪的行爲,我哪裏錯了?

由於提前

阿尼爾

+0

PHP擴展是用C編寫的,而不是C++。 如果您需要在C++應用程序中調用PHP,請使用嵌入式SAPI,但擴展本身將在C中。 – Flavius 2012-04-14 11:09:26

+0

我已更正您的代碼,我希望您不介意。 – Flavius 2012-04-14 11:38:13

回答

1
  1. PHP擴展的目的是用C編寫,而不是C++。如果您需要調用PHP在C++應用程序,使用嵌入SAPI,但擴展自己將在C.

  2. 反正調用zend_parse_parameters()應該是這樣的:

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &a, &a_len,&b, &b_len,&c, &c_len) == FAILURE) 其中_len變量是整數。

使用lxr.php.net作爲參考。

+0

嗨弗拉維斯,我沒有傳遞參數長度和多數民衆贊成在錯誤,謝謝,現在我的C++ DLL是通過PHP代碼響應。非常感謝。 – 2012-04-18 12:48:12

0

你的第一個問題是memset(a, 0, 30);。給出的字符串(可能)只有3個字符長,並且您將30個字符設置爲零字符,可能會運行在字符串緩衝區的末尾。

然後strcpy(a,ss.c_str());很可能會導致類似的緩衝區溢出。

最後,您將返回b(可能已被覆蓋)中的任何內容,而不是連接的結果。

+0

對不起,我困惑你,我從我的代碼評論這些行。我在這些行之前使用了//。 – 2012-04-13 21:57:40